首页 >后端开发 >C++ >使用 Placement New 时,'delete”实际上是否正确解除分配?

使用 Placement New 时,'delete”实际上是否正确解除分配?

Barbara Streisand
Barbara Streisand原创
2024-10-28 12:50:02827浏览

 When Using Placement New, Does `delete` Actually Deallocate Correctly?

放置新建和删除

在 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 函数也是如此。

最佳实践

为避免混淆,请始终使用一对匹配的运算符,例如:

  • ::operator new 和 ::operator delete
  • new()和delete()(放置新建/删除)

以上是使用 Placement New 时,'delete”实际上是否正确解除分配?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn