gpt4 book ai didi

c++ - 为什么C++中没有placement delete表达式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:39 27 4
gpt4 key购买 nike

为什么 C++ 没有直接对应于 placement new 的 placement delete,即调用析构函数并调用适当的 placement delete 运算符?

例如:

MyType *p = new(arena) MyType;
...
//current technique
p->~MyType();
operator delete(p, arena);

//proposed technique
delete(arena) p;

最佳答案

operator delete 的独特之处在于它是动态调度的非成员函数或静态成员函数。具有虚拟析构函数的类型从最派生的析构函数调用它自己的 delete

struct abc {
virtual ~abc() = 0;
};

struct d : abc {
operator delete() { std::cout << "goodbye\n"; }
};

int main() {
abc *p = new d;
delete p;
}

( Run this example .)

要使其与放置删除一起使用,析构函数必须以某种方式将附加参数传递给 operator delete

  • 解决方案 1:通过虚函数传递参数。这需要为每个静态成员和具有不同参数的全局 operator delete 重载一个单独的虚拟析构函数。
  • 解决方案 2:让虚拟析构函数返回一个指向调用者的函数指针,指定应调用什么 operator delete。但是如果析构函数进行查找,这会遇到与#1 相同的需要多个虚函数定义的问题。必须创建某种抽象重载集,由调用者解析。

你的观点非常好,这将是对该语言的一个很好的补充。从理论上讲,将其改造为 delete 的现有语义甚至是可能的。但大多数时候我们并没有使用delete 的全部功能,使用伪析构函数调用后跟arena.release(p) 之类的东西就足够了。

关于c++ - 为什么C++中没有placement delete表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39330151/

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