Как работает удаление?
Возможный дубликат:
Программирование на C: как free знает, сколько стоит free?
Как delete
знаете сколько байт нужно освободить? Я прочитал, что есть некоторый блок перед фактическим адресом указателя, который возвращается новым, который содержит детали адреса блока.
Кто-нибудь здесь, кто знает, сколько байтов имеет этот блок или каков формат этого блока?
3 ответа
В общем, это зависит от реализации.
Обычно это реализуется так, что new/malloc выделит немного больше байтов, чем вы просили, и будет использовать дополнительные байты для некоторого учета: много раз выделенные блоки также будут сохраняться в связанном списке, и так дополнительные байты будут использоваться для хранения следующего / предыдущего указателя, а также размера блока.
Это не обязательно, однако. Вызовы new/malloc также могут хранить ваш указатель и размер блока, скажем, на карте.
Если вы заинтересованы в конкретной реализации, вам нужно будет предоставить больше информации (например, какую среду выполнения / компилятор вы используете?).
Новый оператор и функция malloc обрабатывают память по-своему, поэтому
- если вы распределили память с помощью 'new', используйте 'delete'
- если вы выделили память с помощью 'malloc', используйте 'free'
- если вы не знаете, как / кто / где была выделена память, не освобождайте ее
Если вы непременно попытаетесь испортить внутреннюю работу malloc или new (что кажется вашей целью), вы делаете это неправильно ^^
На этот вопрос нет однозначного правильного ответа, потому что это зависит от ситуации. В некоторых случаях компилятор знает размер объекта во время компиляции и, таким образом, delete знает, сколько байтов нужно освободить. В ситуациях, когда объем памяти неизвестен во время компиляции, используется либо карта памяти, либо, как вы сами предложили, слово, предшествующее указателю, которое сообщает количество выделенных байтов.
Я полагаю, что многое из этого зависит от конкретной реализации, а не от того, на что можно положиться, чтобы идти определенным путем. Этот вопрос очень похож на этот.