gpt4 book ai didi

c++ - new T() 等价于 `mem = operator new(sizeof(T)); new(mem)T` 吗?

转载 作者:行者123 更新时间:2023-12-01 13:00:51 27 4
gpt4 key购买 nike

基本上,我的问题是以下代码是否有效。

void* mem = operator new(sizeof(T));
T* instance = new(mem) T;
delete instance;

如果不是,我很想知道是否有办法为将要通过 delete obj; 删除的对象拆分分配和初始化。 .

最佳答案

只要 T,这似乎是有效的不是数组类型,也不是具有自定义的类 operator delete从其范围可见,这与 operator new 不兼容。你调用。

[expr.delete]/2表示 delete 的操作数可能是“指向由前一个 new 表达式创建的非数组对象的指针”。 new-expression 文法语法符号确实包含了放置 new 语法,并且 [expr.delete] 并没有说之前的 new-expression 需要是一个非放置变体。并且任何包含放置 new 的 new 表达式都被认为是“创建”一个对象。
operator new分配函数和operator delete涉及的释放函数确实需要匹配。 operator new(sizeof(T))通常会调用全局普通分配函数,但更确定你可以写::operator new(sizeof(T)) .在类 T 的范围内查找释放函数, 所以一个 static operator delete(void*);在类里面可以打破这一点。

不过,您可能需要考虑异常安全。一个直T* p = ::new T;实际上更等同于:

void* mem = ::operator new(sizeof(T));
T* p;
try {
p = ::new(mem) T;
} catch (...) {
::operator delete(mem, sizeof(T));
throw;
}

关于c++ - new T() 等价于 `mem = operator new(sizeof(T)); new(mem)T` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60982723/

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