Visual Studio 2010 C ++: получить размер блока памяти, выделенного malloc - PullRequest
4 голосов
/ 10 февраля 2011

Как получить, учитывая указатель на блок памяти, выделенный с помощью malloc, его размер?

Например:

void* ptr = malloc( 10 ); //Allocate 10 bytes
printf( "%d", GetMemSize( ptr ) ); //Should print 10

Я хочу сделать это в целях отладки.

Ответы [ 4 ]

7 голосов
/ 10 февраля 2011

В Visual C ++ для этого можно использовать _msize().

3 голосов
/ 10 февраля 2011

Microsoft CRT имеет функцию size_t _msize(void *memblock);, которая даст вам размер выделенного блока.Обратите внимание, что это может быть (и фактически может быть) больше, чем запрашиваемый размер, из-за того, как менеджер кучи управляет памятью.

Это зависит от реализации, как упоминалось в других ответах.

0 голосов
/ 10 февраля 2011

Не существует общего (стандартизированного) способа сделать это, поскольку реализация malloc зависит от системы и архитектуры. Единственное гарантированное поведение заключается в том, что malloc(N) вернет не менее N байтов или NULL. malloc всегда выделяет больше памяти, чем запрошено, - для хранения запрошенного размера (N) и, как правило, некоторых дополнительных учетных данных.

Для Windows / Visual C ++:

Дополнительные данные сохраняются в сегменте памяти перед тем, адрес которого возвращается malloc.

Если p = malloc(N) и p != 0, вы можете использовать следующий код, чтобы определить объем памяти, запрашиваемый, если вы знаете только p:

Windows NT: unsigned long ulAllocSize = *((unsigned long*)p - 4);

Windows CE: unsigned long ulAllocSize = *((unsigned long*)p - 2);

Обратите внимание, что ulAllocSize - это не размер всего блока, выделенного с malloc, а только значение, переданное в качестве аргумента - N.

0 голосов
/ 10 февраля 2011

Размеры можно получить, только если вы знаете, как они реализованы, так как это зависит от конкретной реализации. Я должен был отслеживать память и писать свои собственные обертки, как в этот вопрос . Итак, как говорит Дэвид Хеффернан, вы должны помнить размер, который я должен был сделать в упаковках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...