Вопросы о MMGR - PullRequest
       22

Вопросы о MMGR

0 голосов
/ 03 июля 2011

Я смотрю на MMGR для проверки выделения памяти, и у меня есть несколько вопросов, которых я больше не вижу в Интернете.

1) Существует «заявленный размер» и «фактический размер». Я понимаю, что такое «заявленный размер», а каков размер, который получает новичок, но что такое «фактический размер»? Почему есть разница?

2) Безопасно ли ведение журнала? Я вижу, что регистрация происходит в конце статического освобождения класса, однако может ли это дать ложный положительный результат утечек памяти? 2А) Просто чтобы быть уверенным, статические освобождения всегда происходят в последнюю очередь, верно?

3) Безопасен ли этот код? Если нет, как это может стать потокобезопасным?

1 Ответ

0 голосов
/ 03 июля 2011

Боюсь, у меня нет опыта работы с MMGR, поэтому я могу дать ответ только на ваш первый вопрос.

Причина, по которой некоторые отладчики памяти упоминают сообщаемый (или запрашиваемый) и фактический размер выделения, связана с работой распределителей памяти. Они редко выделяют точно требуемый размер - обычно они резервируют немного больше. Существуют различные возможные причины:

  • Проблемы выравнивания: я не думаю, что есть распределитель, который выделит, например, ровно 3 байта в современной 32-битной (или более) системе. Значение будет округлено до как минимум , следующего кратному размеру слова или 4, в зависимости от архитектуры.

  • Проблемы управления: некоторые распределители будут обрабатывать только распределения, рассчитанные на степени двух. Таким образом, вы получаете блоки по 4, 8, 16, 32, 64, 128, 256 и т. Д. Это редко встречается в распределителях пространства пользователя, но распространено в распределителях ядра.

  • Провидение: некоторые распределители будут выделять немного больше каждый раз в ожидании возможного перераспределения.

В любом случае, зарезервированная память часто будет несколько больше запрашиваемого объема, следовательно, существует два числа.

...