【发布时间】:2017-04-18 23:26:52
【问题描述】:
我目前正在研究一个用 C++ 编写的堆栈分配器。应该可以通过模板方法从这个堆栈分配器中获取对象。一旦调用了另一个释放方法,这些对象就应该被销毁。在尝试不同的方法来实现析构函数的调用时,我偶然发现了以下内容:
auto destructor = someObject->~SomeClass;
destructor();
析构函数似乎被实际调用了,但是这对我来说有点奇怪。我有以下问题:
- 这是明确定义的行为吗?
- 析构函数的类型是什么(我可以用什么替换 auto 关键字)?
- 是否可以将多个不同类型对象的所有析构函数地址保存在一个列表中,然后再调用它们?
【问题讨论】:
-
绝对不安全。如果你不小心调用了两次析构函数会发生什么?
-
是的,我知道这很危险。如果通过在调用后删除地址来明确定义危险,我会解决危险。
-
什么编译器允许这样做?我尝试时 g++ 和 clang++ 都会抱怨。
-
您可能正在寻找
deferred_heap。它带有一个免费的CppCon talk。 -
格式不正确,请参阅§[class.dtor]/p2:
The address of a destructor shall not be taken。这基本上是未定义的行为,但我会提交错误报告,最好得到诊断。
标签: c++ c++11 memory memory-management