首页  >  文章  >  后端开发  >  如何正确释放 C 中通过 Placement New 分配的内存?

如何正确释放 C 中通过 Placement New 分配的内存?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-30 18:24:03680浏览

How to Properly Deallocate Memory Allocated with Placement New in C  ?

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中文网其他相关文章!

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