@ArtemITS
programmer developer

Где хранится размер памяти, которая выделена указателю?

Поясню вопрос.
Когда выделяем память указателю, то указываем размер:
float *ptrarray = new float [10];  // Выделяем память под массив из 10 элементов

А когда освобождаем память, то размер опускается:
delete [] ptrarray;  // Вопрос: А кто здесь подсказывает размерность 10 ?
  • Вопрос задан
  • 129 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Начнем вот с этого: CppCon 2015: Andrei Alexandrescu “std::allocator I...

На самом низком уровне память выделяется страницами или блоками. Принцип выделения зависит от особенностей организации ОС и самого железа. Освобождается память в точном соответствии с тем, как она была выделена.
И обычный пользователь C++ этого ничего не видит.

Оператор ::new является точкой обращения к аллокатору памяти процесса. К какому именно аллокатору идет обращение - как правило неизвестно. Это может быть dlmalloc, mimalloc или jemalloc. Их много и перечислять можно долго. Это может быть и самостоятельно созданный по мотивам доклада Александреску аллокатор.
Каждый аллокатор, маркируя память как выделенную и передавая ее пользователю, каким-либо образом оформляет сервисную информацию о выделенном участке. Сервисная информация может храниться в заголовке, в памяти прямо перед отдаваемым пользователю адресом, может храниться в хвосте передаваемого пользователю участка памяти, а может храниться в совершенно отдельном пространстве памяти - в сервисном разделе.

К чему это все. К тому что полностью точного ответа на твой вопрос дать не получится. Если бы в вопросе фигурировал конкретный аллокатор, то ответить можно было бы. Сейчас же ответить можно только что размер переданного пользователю блока памяти хранится в специальной сервисной информации, к которой и обращается функция освобождения памяти (не ::delete).
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
Менеджер памяти при выделении памяти записывает эту информацию в специальный тег.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы