Как работает удаление?

Возможный дубликат:
Программирование на C: как free знает, сколько стоит free?

Как delete знаете сколько байт нужно освободить? Я прочитал, что есть некоторый блок перед фактическим адресом указателя, который возвращается новым, который содержит детали адреса блока.

Кто-нибудь здесь, кто знает, сколько байтов имеет этот блок или каков формат этого блока?

3 ответа

Решение

В общем, это зависит от реализации.

Обычно это реализуется так, что new/malloc выделит немного больше байтов, чем вы просили, и будет использовать дополнительные байты для некоторого учета: много раз выделенные блоки также будут сохраняться в связанном списке, и так дополнительные байты будут использоваться для хранения следующего / предыдущего указателя, а также размера блока.

Это не обязательно, однако. Вызовы new/malloc также могут хранить ваш указатель и размер блока, скажем, на карте.

Если вы заинтересованы в конкретной реализации, вам нужно будет предоставить больше информации (например, какую среду выполнения / компилятор вы используете?).

Новый оператор и функция malloc обрабатывают память по-своему, поэтому

  • если вы распределили память с помощью 'new', используйте 'delete'
  • если вы выделили память с помощью 'malloc', используйте 'free'
  • если вы не знаете, как / кто / где была выделена память, не освобождайте ее

Если вы непременно попытаетесь испортить внутреннюю работу malloc или new (что кажется вашей целью), вы делаете это неправильно ^^

На этот вопрос нет однозначного правильного ответа, потому что это зависит от ситуации. В некоторых случаях компилятор знает размер объекта во время компиляции и, таким образом, delete знает, сколько байтов нужно освободить. В ситуациях, когда объем памяти неизвестен во время компиляции, используется либо карта памяти, либо, как вы сами предложили, слово, предшествующее указателю, которое сообщает количество выделенных байтов.

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

Другие вопросы по тегам