«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как правильно освободить память, выделенную с помощью нового размещения в C++?

Как правильно освободить память, выделенную с помощью нового размещения в C++?

Опубликовано 7 ноября 2024 г.
Просматривать:682

How to Properly Deallocate Memory Allocated with Placement New in C  ?

размещение нового и удаление Загадка

В C при выделении памяти с помощью оператора размещения нового возникает дилемма относительно подходящего метода освобождения эта память. Давайте рассмотрим два потенциальных решения:

Решение 1:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;

Это решение пытается удалить выделенную память как указатель на символ. Однако этот подход неверен, поскольку он неправильно обрабатывает деструктор объекта или не освобождает необработанную память.

Решение 2:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;

Это решение также пытается удалить выделенную память, но напрямую вызывает оператор удаления в указателе Buffer*. Это сработало бы, если бы память выделялась с помощью обычного нового оператора. Однако, поскольку использовалось новое размещение, этот подход также неверен.

Правильное решение:

Правильный метод освобождения выделенной памяти:

buf->~Buffer();
::operator delete(mem);

Это решение явно вызывает деструктор объекта Buffer (buf->~Buffer()), а затем освобождает необработанную память с помощью функции удаления оператора (::operator delete( mem)).

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

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3