Как delete [] знает, сколько памяти удаляется? [Дубликат]

0
int* i = new int[4];
delete[] i;
  1. Хотя мы вызываем delete [], как программа знает, что "i" имеет длину 4 байта. 4 хранится где-то в памяти?
  2. Реализация delete [] зависит от System или Compilers?
  3. Есть ли какой-либо системный API для получения длины i?

Как сказал HadeS, в котором будет храниться информация о том, сколько памяти было выделено? И где? Он должен храниться в памяти или, может быть, рядом с указателем i.

  • 0
    у меня нет 4-х байтовой длины
Теги:
delete-operator

2 ответа

6
Лучший ответ

Во-первых, i не "4-байтовая длина". Скорее, i является указателем на массив из четырех целых чисел.

Далее, delete[] не нужно ничего знать, потому что int не имеет деструктора. Все, что должно произойти, состоит в том, что память должна быть освобождена, что делает системный распределитель. Это та же ситуация, что и со free(p) - вам не нужно free говорить, сколько памяти нужно освободить, так как вы ожидаете, что это будет понятно.

Ситуация другая, когда нужно называть деструкторов; в этом случае реализация C++ действительно должна запоминать количество C++ объектов отдельно. Метод для этого зависит от реализации, хотя многие компиляторы следуют популярному Itanium ABI, который позволяет связывать объектный код, скомпилированный этими разными компиляторами.

Вы не можете запросить эту информацию. Вы должны рассматривать динамические массивы как неработоспособные C++; по существу нет оснований для их использования *, и вы всегда можете делать лучше с каким-то классом, который управляет памятью и объектом отдельно и индивидуально: так как вам все равно придется запоминать количество элементов массива, гораздо лучше инкапсулировать размер и распределение в одном когерентном классе, а не иметь неопределенные динамические массивы, которые вы не можете использовать, не передавая дополнительную информацию в любом случае (если у вас нет самоограничивающей семантики, но тогда вы просто будете использовать дополнительное пространство для терминатора),

*) И есть как минимум два стандартных дефекта относительно динамических массивов, которые никто не беспокоит, чтобы беспокоиться о фиксации

  • 0
    Это не отвечает на вопрос ОП. Может быть, вы должны прочитать статью о том, как реализован malloc
  • 0
    @texasbruce: Вопрос не в отношении malloc .
Показать ещё 6 комментариев
0

Когда вы динамически выделяете память; компилятор выделяет дополнительный блок памяти, кроме того, что вы просили, в котором будет храниться информация о how much memory has been allocated. когда вы пытаетесь удалить эту память с помощью delete этот дополнительный блок памяти будет прочитан компилятором, чтобы узнать, сколько памяти было выделено, и освободите место соответственно.

Я не думаю, что есть какой-либо API, который будет получать эту информацию.

  • 0
    Это не гарантировано, и на самом деле это не так.
  • 1
    Компилятор не выделяет память и не читает ее.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню