Как узнать, сколько места выделено при вызове malloc ()? - PullRequest
8 голосов
/ 08 октября 2010

Я пытаюсь написать функцию размера следующим образом:

size(void *p,int size);

Что бы вернуть размер массива, на который указывает p. Например:

Int *a = malloc((sizeof(int)*100));
size(a,sizeof(int)); // this should return 100

Я думаю, что это возможно, потому что, если я вспомню, malloc отслеживает пространство, выделенное в некоторых байтах заголовка.

Вот что у меня есть:

int size(void *p, int size)
{
  p = (unsigned int *)p - 1;
  unsigned int elements = (*(unsigned int *)p);
  return elements/size;
}

Теперь, если предположить, что размер выделенного пространства находится в 4 байтах перед указателем, это должно вернуть байты или смещение. Это где я немного в темноте. Я не могу понять особенности того, как malloc форматирует эти байты заголовка. Как malloc упаковывает биты заголовка?

Спасибо, я ценю это. Я уверен, что с этим кодом что-то не так, и он не особенно переносим и может зависеть от системы, но я делаю это для развлечения.

Ответы [ 7 ]

6 голосов
/ 08 октября 2010

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

6 голосов
/ 08 октября 2010

В Visual Studio вы можете использовать _msize().

4 голосов
/ 08 октября 2010

Я думаю, что вы полагаетесь на какое-то специфическое для реализации поведение malloc().Реализация malloc() зависит от системы, а в спецификации очень мало говорится о том, как это выполняется.

2 голосов
/ 08 октября 2010

Нет портативного способа сделать это. Как уже говорили другие, либо посмотрите на код вашего распределителя, если вы делаете одноразовую программу, просто копаться в ней, либо для некоторых библиотек (MS) существуют расширения, такие как _msize. malloc разрешено делать то, что он хочет внутри распределителя, чтобы отслеживать вещи, и нет никакого "безопасного" или стандартного способа получения этих данных.

Если вам действительно нужна эта возможность надежно в реальном приложении, вам нужно будет создать оболочку около malloc/free, которая хранит таблицу размеров размещения.

1 голос
/ 08 октября 2010

Вы можете найти полезными функции , связанные с glibc.В частности, вы можете позвонить mallinfo(), чтобы получить информацию о куче.Некоторые системы также определяют malloc_size, что является эквивалентом BSD _msize.

0 голосов
/ 08 октября 2010

Это не в стандарте.Но для этого есть функции, специфичные для платформы, например _msize или malloc_usable_size.

0 голосов
/ 08 октября 2010

Если вы действительно хотите пойти по этому пути, dlmalloc (malloc, используемый в glibc и uClibc среди других) имеет несколько документов на http://g.oswego.edu/dl/html/malloc.html. Кроме того, поиск в Google, как использовать переполнения кучи, будет вероятно, предоставит вам подробную информацию для каждой платформы, в том числе без исходного кода.

...