Как динамически распределяемые массивы освобождаются в C ++? - PullRequest
1 голос
/ 09 октября 2009

Я знаю, что вы должны сделать это так:

int * p;
p = new int[10];

//use array

delete [] p;

Теперь мой вопрос: поскольку это не указано явно, как возможно, что освобождается правильное количество памяти? Отслеживает ли ОС выделенную память и ее начальный адрес?

Ответы [ 4 ]

5 голосов
/ 09 октября 2009

Да, ОС (или, скорее, библиотека) отслеживает.

Когда вы распределяете память, ОС создает небольшой заголовок вашей памяти, который обычно находится непосредственно перед вашей выделенной памятью, то есть по несколько более низкому адресу на несколько байтов.

При освобождении памяти он берет освобожденный указатель, возвращает несколько байтов и проверяет структуру, которая описывает то, что было фактически выделено, включая размер того, что было выделено.

2 голосов
/ 09 октября 2009

Библиотека времени выполнения будет отслеживать выделенные блоки памяти. Гарантируется правильное освобождение блока, учитывая начальный указатель, возвращаемый new.

Хотя может быть реализовано в самой ОС (теоретически), обычно это не так. ОС отслеживает страницы, выделенные для процесса в целом, а не отдельные блоки, выделенные на этом уровне абстракции.

1 голос
/ 09 октября 2009

Это полностью зависит от реализации. Как и в случае с обычным malloc () / free (), в системе должна быть сохранена некоторая дополнительная информация, как вы упомянули. В общем, вызов malloc () или оператора new устанавливает структуру заголовка в памяти непосредственно перед указателем, который он возвращает вам, так что позже, когда вызывается free () или оператор delete, он может выяснить, что происходит с блоком памяти вы его передали.

0 голосов
/ 09 октября 2009

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

...