Нет технических проблем, мешающих стандартному комитету C добавить новую библиотечную функцию для получения числа байтов, доступных через действительный указатель, ранее возвращенный malloc()
, calloc()
, realloc()
, aligned_alloc()
, strdup()
или любая аналогичная функция. Возвращаемое число не обязательно должно быть размером, первоначально переданным функции распределения, и возможно, что эта информация вообще может быть недоступна, поэтому возвращаемое значение 0
будет означать, что информация недоступна.
Причина, по которой такая функция еще не добавлена, может заключаться в том, что Комитет по стандартизации C обычно очень неохотно добавляет новые функции. Например, потребовалось более 30 лет, чтобы strdup()
наконец добрался до стандарта C (он будет частью следующей версии), несмотря на то, что согласованные реализации были доступны в большинстве библиотек C на протяжении десятилетий.
Эта функция будет иметь неопределенное поведение для любого указателя, ранее не возвращенного функцией выделения памяти или уже освобожденного, как free
или realloc
. Является ли он определенным для NULL
, является спорным, но возвращаемое значение 0
представляется уместным в этом случае. Если размер неизвестен, что возможно для фиктивных распределителей, которые не хранят эту информацию, возвращаемое значение 0
также будет указывать на это условие.
Вот реферат со страницы руководства malloc_usable_size
присутствует в GNU lib C:
NAME
malloc_usable_size
- получить размер блока памяти, выделенного из кучи
SYNOPSIS
#include <malloc.h>
size_t malloc_usable_size(void *ptr);
ОПИСАНИЕ
Функция malloc_usable_size()
возвращает количество используемых байтов в блоке, на который указывает ptr
указатель на блок памяти, выделенный с помощью malloc(3)
или связанной функции.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
malloc_usable_size()
возвращает количество используемых байтов в блоке выделенной памяти, на которую указывает ptr
. Если ptr
равно NULL
, возвращается 0
.
АТРИБУТЫ
Многопоточность (см. pthreads(7)
): функция malloc_usable_size()
является потоковой safe.
СООТВЕТСТВУЕТ
Эта функция является расширением GNU.
ПРИМЕЧАНИЯ
Значение Возвращаемый malloc_usable_size()
может быть больше, чем запрошенный размер выделения из-за ограничений выравнивания и минимального размера. Хотя избыточные байты могут быть перезаписаны приложением без негативных последствий, это не очень хорошая практика программирования: число избыточных байтов в выделении зависит от базовой реализации.
Основное использование этой функции - для отладки. и самоанализ.
СМОТРИ ТАКЖЕ
malloc(3)