首页 > 后端开发 > C++ > 正文

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

Mary-Kate Olsen
发布: 2024-10-30 18:24:03
原创
681 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!