gpt4 book ai didi

c++ - 放置新行为等效

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:52:47 24 4
gpt4 key购买 nike

我有一个关于 C++ 中放置 new 语法的问题。以下两个代码片段在功能上是否等效并且可以互换使用(我并不是暗示应该使用第二个,当第一个适合时)?

#1

T* myObj = new T();
// Do something with myObj
delete myObj;

#2

char* mem = new char[sizeof(T)];
T* myObj = new (mem) T();
// Do something with myObj
myObj->~T();
delete[] mem;

当我使用这样的 placement new 语法时,有什么我应该特别注意的吗?

最佳答案

它们不等价,因为如果 T 的构造函数或析构函数抛出,它们会有不同的行为。

new T() 将释放任何已分配的内存,然后让异常进一步传播。 char* mem = new char[sizeof(T)]; T* myObj = new (mem) T(); 不会(除非你明确地做一些事情来确保它被释放,否则你会有泄漏)。同样,delete myObj 将始终释放内存,无论 ~T() 是否抛出。

T* myObj = new T();/*other code*/delete myObj; 的完全等价物如下:

//When using new/delete, T::operator new/delete
//will be used if it exists.
//I don't know how do emulate this in
//a generic way, so this code just uses
//the global versions of operator new and delete.
void *mem = ::operator new(sizeof(T));
T* myObj;
try {
myObj = new (mem) T();
}
catch(...) {
::operator delete(mem);
throw;
}
/*other code*/
try {
myObj->~T();
::operator delete(mem);
}
catch(...) {
//yes there are a lot of duplicate ::operator deletes
//This is what I get for not using RAII ):
::operator delete(mem);
throw;
}

关于c++ - 放置新行为等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10585740/

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