2016-06-23 7 views
-1

Я выделяю пространство ::operator new(sizeof(T) * count).Я получаю очень разные адреса при распределении пространства

1-й вызов возвращает адрес 0x742f30, а второй возвращает 0x7f2ef0000d60. Я теперь смущен огромной разницей.

Мой вопрос: Это нормально, что возвращенные адреса могут сильно отличаться?

Update:

SLES 11 SP3 VM on XenServer 
gcc 4.9.3 
10 GB RAM 

Update:

Потому что некоторые люди подозревают неверный формат. Я показываю возвращаемый адрес командой new с тем же printf. Я скопировал значения указателя на этот вопрос, скопировав и вставив их и дважды проверив их. Они соответствуют выходному сигналу моего Memory Allocator.

+0

Да, поскольку память на самом деле отмечает местоположения как нераспределенные, и это может быть небольшой блок, разбросанный по всей памяти, не заразный. – MoustafaS

+0

Можете ли вы разместить код? Идеально то, что мы можем скомпилировать и поиграть с собой. –

+0

Это ** очень странно ** ... Разница примерно: ** ~ 140 ТБ ** - Вы уверены, что правильно разместили цифры? – WhiZTiM

ответ

0

Предполагая, что нет никаких ограничений относительно местоположения требуемого блока памяти, если результат является допустимым указателем памяти (то есть не null), его следует считать штрафом. Но я, как программист, был бы удивлен, если бы ответ от функции выделения памяти был отформатирован по-другому (в данном случае с другим числом цифр).

Учитывая, что это ваша собственная библиотека, я бы хотя бы удостоверился, что он всегда выводит адрес выделенной памяти в точно таком же формате.

1

Возможная причина в том, что первый объект был выделен в начальном сегменте данных процесса, но к тому времени, когда вы выделили второй объект, который был заполнен. Традиционные распределители памяти используют sbrk() для расширения сегмента данных, но некоторые современные распределители памяти используют mmap() на /dev/zero для создания новых сегментов памяти. Это может выделить его виртуальную память в очень отдаленной части адресного пространства.

+0

Странный указатель возвращается в 3-ем распределении в моем собственном модуле памяти STL. Я действительно не думаю, потому что объект заполнен. Я бы хотел опубликовать код, но он слишком сложный для публикации здесь. Существуют десятки структур, которые выделяются запоминающим устройством памяти. Во всяком случае, уже 3 человека проголосовали за закрытие этого вопроса, поэтому я думаю, что он все равно будет закрыт. У нас сейчас в Центральной Европе 1:30, и я должен ложиться спать.Программа теперь работает в течение нескольких часов с большим количеством потоков, и она не падает -> странные указатели действительно указывают на действительную память. –

0

Отвечаю, что это должна быть какая-то странная виртуализация памяти Linux. Вывод адресов всегда в одном формате. Я думаю, что ответ от Бармара очень близок к реальной причине. Могу я спросить SuSe IT, и у них есть ответ на это.