放置新建和删除
在 C 中,运算符重载允许使用自定义新建和删除运算符。然而,这提出了如何正确释放使用此类运算符分配的内存的问题。考虑以下代码片段:
<code class="cpp">const char* charString = "Hello, World"; void *mem = ::operator new(sizeof(Buffer) + strlen(charString) + 1); Buffer* buf = new(mem) Buffer(strlen(charString)); delete (char*)buf; // OR delete buf;</code>
将内存释放任务委托给重载的删除运算符(直接方法)似乎是合乎逻辑的。但是,这种方法是不正确的。
正确方法
在这种情况下释放内存的正确方法是显式调用对象的析构函数,然后调用运算符delete 函数释放分配的内存:
<code class="cpp">buf->~Buffer(); ::operator delete(mem);</code>
说明
当使用需要预先分配内存地址的放置 new 运算符时,默认构造函数是不会自动调用。因此,手动调用析构函数至关重要。或者,直接调用delete buf也是不正确的,因为它只调用全局运算符delete,而它不知道放置新分配。
何时使用Buf->~Buffer()
每当使用放置 new 运算符时都需要析构函数调用 (buf->~Buffer()),即使随后调用 ::operator delete 函数也是如此。
最佳实践
为避免混淆,请始终使用一对匹配的运算符,例如:
以上是使用 Placement New 时,'delete”实际上是否正确解除分配?的详细内容。更多信息请关注PHP中文网其他相关文章!