размещение нового и удаление Загадка
В 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