为什么c++中没有位置删除表达式
Why there is no placement delete expression in C++?
为什么c++没有直接对应于位置new的位置delete,即调用析构函数并调用适当的位置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 << "goodbyen"; }
};
int main() {
abc *p = new d;
delete p;
}
(运行本例)
如果要与位置删除一起工作,析构函数必须以某种方式将额外的参数传递给operator delete
。
- 方案一:通过虚函数传递实参。这需要为每个静态成员和具有不同参数的全局
operator delete
重载单独的虚析构函数。 - 解决方案2:让虚析构函数返回一个指向调用者的函数指针,指定应该调用什么
operator delete
。但是,如果析构函数进行查找,就会遇到与#1相同的问题,即需要定义多个虚函数。必须创建某种抽象的重载集,由调用者来解析。
你有一个非常好的观点,这将是对语言的一个很好的补充。从理论上讲,将其改造成delete
的现有语义甚至是可能的。但是大多数情况下,我们不会使用delete
的全部功能,使用伪析构函数调用后面跟着arena.release(p)
之类的东西就足够了。
可能是因为有显式调用析构函数而不释放的语法(就像你的问题一样),但没有在原始内存中显式构造的语法?
实际上,如果构造函数抛出异常,则存在一个放置delete操作,该操作由实现调用,用于使用放置new"分配"的对象。
从维基百科。位置delete函数从位置new表达式调用。特别是,如果对象的构造函数抛出异常,则调用它们。在这种情况下,为了确保程序不会引起内存泄漏,将调用位置删除函数。
放置new的全部意义在于将对象创建与其内存管理分开。因此,在对象销毁期间将其绑定是没有意义的。如果你的对象的内存来自堆,并且你希望对象和它们的内存具有相同的生命周期,那么使用operator new
和operator delete
,如果你想要任何特殊的行为,可能会覆盖它们。
new的位置很好,例如在vector中,它保留了大量的原始内存,并在其中创建和销毁对象,但不释放内存。
相关文章:
- C++ 从具有开始位置和结束位置的列表中删除
- 在双链表中的某个位置删除
- C++访问冲突读取位置0xDDDDDDCD当我尝试删除已更新的数组时
- 如何正确删除一行控件并在该位置动态创建一个新控件
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 从文件对象的当前位置删除字符
- 设置位置时QT删除对象()
- 我如何在代码中找到(和删除)需要管理员特权的位置
- 试图从链接列表中删除位置
- 指向对象的内存位置的指针已在程序中删除,但仍提供正确答案而不是垃圾值
- 在任意位置进行快速查找和删除的Deque样数据结构
- 应删除传递参数时创建对象的位置
- 如何在不删除任何字符的情况下将字符从字符串中的某个位置移动到其最前面
- 删除位置 (C++)
- C 删除具有内存位置的操作员
- 我可以使用C++删除堆栈中的特定位置数据吗?
- 不受限制的工会上的位置删除
- 如何根据列表中的位置删除特定项目
- 在列表末尾插入一个整数,并在第n个位置删除
- 为什么c++中没有位置删除表达式