gpt4 book ai didi

c++ - 在新放置缓冲区上调用析构函数?

转载 作者:行者123 更新时间:2023-11-30 01:14:27 25 4
gpt4 key购买 nike

所以我有这门课

class Obj{           //simple class with constructor + destructor

public:
Obj(){cout<<"Obj1 has been created"<<endl;}
~Obj(){cout<<"Obj1 has been destroyed"<<endl;}
};


Obj * buffer[10]; //buffer



int main(int argc, char *argv[])
{
Obj * c = new(&buffer[0]) Obj;
delete &buffer[0];
system("PAUSE");
return EXIT_SUCCESS;
}

这种使用"new"展示位置的方法是否有效?因为当我尝试删除地址时,没有调用析构函数。

但是如果我使用这行代码,就会调用析构函数

  Obj * c = new(&buffer[0]) Obj;
delete c;

谁能告诉我发生了什么事?我真的必须删除指针才能调用析构函数吗?

最佳答案

在您的示例中使用 placement new 以及试图销毁它都是无效的:

  • 数组buffer 包含指向Obj 的指针。不能保证指针为对象产生足够的空间,或者指针正确对齐以容纳对象的对象。
  • 要销毁使用 placement new 构造的对象,您需要一个显式的析构函数调用,类似于 ptr->~Obj()

正确使用展示位置可能是这样的:

Obj*  objects[10];
char* buffers[10];
// ...
buffers[1] = new char[sizeof(Obj)];
objects[1] = new(buffers[1]) Obj();
// ...
objects[1]->~Obj();
delete[] buffers[1];

(显然,在实际代码中,您会通过合适的 RAII 类来保护不同的缓冲区和对象以避免资源泄漏)。

关于c++ - 在新放置缓冲区上调用析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30283302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com