对 Placement New 进行适当的内存管理
使用 Placement New 时,程序员有责任手动调用析构函数并释放分配的内存。这与删除运算符的默认行为不同,删除运算符通常处理这两个任务。
为什么不删除?
在提供的代码中:
char* pMemory = new char[sizeof(MyClass)]; MyClass* pMyClass = new(pMemory) MyClass();
使用 new[] 手动为与 MyClass 对象对应大小的字符数组分配内存。然后使用放置 new 来在该内存中构造对象。
这里使用 delete 是不正确的,因为操作符 new[] 是用来手动分配内存的。 delete 用于使用operator new分配的内存,但这里不是这种情况。
析构函数的责任
由于使用了placement new,因此程序员有责任调用析构函数释放对象。但是,这不会自动释放分配的内存。为了防止内存泄漏,应该在调用析构函数后显式释放内存。
使用内部缓冲区放置新
放置新也可以与内部缓冲区一起使用未使用运算符 new 进行分配。在这种情况下,不应调用删除操作符,因为它可能会导致意外行为或内存损坏。
例如:
struct buffer_struct { std::aligned_storage_t<sizeof(MyClass), alignof(MyClass)> buffer; }; MyClass* pMyClass = new (&a.buffer) MyClass(); //created inside buffer_struct a
在这种情况下,buffer_struct 为MyClass 对象,但对象构造和销毁是分别使用放置 new 和析构函数独立处理的。
以上是放置新:为什么我们不能使用'delete”来释放内存?的详细内容。更多信息请关注PHP中文网其他相关文章!