placement new 和 delete 难题
在 C 中,当使用placement new 运算符分配内存时,会出现关于取消分配的适当方法的困境那个记忆。让我们探讨两种可能的解决方案:
解决方案 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* 指针上的删除运算符。如果使用常规的 new 运算符分配内存,这将起作用。然而,由于使用了placement new,这种做法也是不正确的。
正确的解决方案:
释放分配的内存的正确方法是:
buf->~Buffer();
::operator delete(mem);
此解决方案显式调用 Buffer 对象的析构函数 (buf->~Buffer()),然后使用运算符删除函数 (::operator delete( mem)).
这里的关键区别是,当使用placement new时,必须直接调用操作符delete函数来释放原始内存。尝试删除从放置 new 运算符获得的指针将无法正确调用析构函数或完全释放内存。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3