LINUX.ORG.RU

размер выделенной памяти


0

0

Подскажите можно ли узнать размер выделенной памяти.
Язык си. Дело в том что мне до освобожнения выделенной памяти (malloc-ом)нужно ее нулями забивать(идея не моя сертификаторы требуют). Хранить размер каждого выделенного блока накладно получается, да и не всегда возможно (указатель может передаваться во множество ф-ций и нужно будет перекапавать 2 мега уже написанного кода). Можно ли как нибудь по указателю узнать сколько под него памяти выделенно?
anonymous

сорри за текст в одну строку

anonymous
()

Насколько я помню, в POSIX такого не было. Но где-то было. Завтра... кх-м... уже сегодня до работы доберусь - поищу.

watashiwa_daredeska ★★★★
()

По-моему malloc и free определены (по крайней мере в GNU Libc) как weak. Даже не копаясь в потрохах Libc можно при каждом malloc(x) вызывать libc_malloc(x+sizeof(unsigned long)) и хранить размер выделенной памяти в конце блока, определить свой malloc с не weak linkage и прикомпоновать его к основному бинарнику.

IMHO.

Murr ★★
()
Ответ на: комментарий от Murr

> По-моему malloc и free определены (по крайней мере в GNU Libc) как weak.

Weak значит, что функция может быть переопределена, то есть взята при линковке из другого модуля?

> Даже не копаясь в потрохах Libc можно при каждом malloc(x) вызывать libc_malloc(x+sizeof(unsigned long)) и хранить размер выделенной памяти в конце блока,

В конце выделенного блока? А как конец блока узнать-то? По условию у нас только указатель. Или имелся в виду какой-то другой блок?

> определить свой malloc с не weak linkage и прикомпоновать его к основному бинарнику.

Решение с mymalloc мне кажется более переносимым и понятным. Заменить же вызовы malloc на mymalloc, free на myfree и т.д. в программе особого труда не должно составить.

anonymous
()
Ответ на: комментарий от anonymous

>Weak значит, что функция может быть переопределена, то есть взята при линковке из другого модуля?

Именно так.

>В конце выделенного блока? А как конец блока узнать-то? По условию у нас только указатель. Или имелся в виду какой-то другой блок?

Извиняюсь, стормозил. В начале, конечно же. Аналогично переопределить free.

>Решение с mymalloc мне кажется более переносимым и понятным. Заменить же вызовы malloc на mymalloc, free на myfree и т.д. в программе особого труда не должно составить.

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

Предложенный мной способ хорош тем, что должен работать и при наличии объектников от приложения(исходный код необязателен).

Murr ★★
()
Ответ на: комментарий от Murr

> В начале, конечно же. Аналогично переопределить free.

Еще надо возврашать указатель не на начало выделенного блока, а с учетом смещения на размер поля, хранящего длину. Собственно реализацию всего этого и можно подсмотреть в исходниках postfix'а.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.