手动分配内存的正确清理:“放置新”和“删除”
在 C 中,可以手动管理内存分配和释放使用“放置新”和“删除”运算符。这使得内存管理具有更大的灵活性,但也引入了潜在的陷阱。让我们深入研究释放使用“placement new”分配的内存的正确方法。
考虑下面的代码片段:
<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;</code>
<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 buf;</code>
在这两个示例中,内存都是使用低分配的-level 运算符 new 函数并转换为 void*。然后,使用“placement new”语法在分配的内存中构造一个 Buffer 对象。
但是,关键的区别在于释放。第一个片段错误地尝试将 buf 指针作为 char* 删除,假设内存块是使用运算符 new 分配的。但是,这会导致内存损坏。
第二个片段演示了正确的方法:
<code class="cpp">buf->~Buffer(); ::operator delete(mem);</code>
使用“placement new”时,还必须手动调用析构函数。然后,您应该调用运算符删除函数,提供与运算符 new 所使用的相同的指针。这确保了对象被正确销毁,并且分配的内存被释放回系统。
记住,只删除您分配的内容。直接调用operator new需要手动调用operator delete和析构函数来完成内存清理。
以上是如何在 C 中正确释放通过“placement new”分配的内存?的详细内容。更多信息请关注PHP中文网其他相关文章!