placement new 和 delete 难题
在 C 中,当使用placement new 运算符分配内存时,会出现关于释放分配的适当方法的困境那个记忆。让我们探讨两种可能的解决方案:
解决方案 1:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete (char*)buf;</code>
此解决方案尝试删除作为字符指针分配的内存。但是,这种方法是不正确的,因为它无法正确处理对象的析构函数或释放原始内存。
解决方案 2:
<code class="c++">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete buf;</code>
此解决方案还尝试删除分配的内存,而是直接调用 Buffer* 指针上的删除运算符。如果使用常规的 new 运算符分配内存,这将起作用。然而,由于使用了placement new,这种方法也是不正确的。
正确的解决方案:
释放分配的内存的正确方法是:
<code class="c++">buf->~Buffer(); ::operator delete(mem);</code>
此解决方案显式调用 Buffer 对象的析构函数 (buf->~Buffer()),然后使用运算符删除函数 (::operator delete(mem)) 释放原始内存。
这里的关键区别是,使用placement new时,必须直接调用operator delete函数来释放原始内存。尝试删除从放置 new 运算符获得的指针将无法正确调用析构函数或完全释放内存。
以上是如何正确释放 C 中通过 Placement New 分配的内存?的详细内容。更多信息请关注PHP中文网其他相关文章!