我试图在Turbo C ++中显式调用类的析构函数:
A a;
a.~A();
但它显示错误:
预期会员标识符。
有没有办法在Turbo C ++中显式调用析构函数?
答案 0 :(得分:5)
当automatic duration
的对象超出范围时,您不需要显式调用析构函数,它的析构函数将被隐式调用。
void main()
{
A a;
//a.~A(); // you need to comment out this line
} // a.~A() is called again, you try to destroy an object twice.
答案 1 :(得分:5)
从this link开始,您实际上可以这样做,有效格式为:
A a;
// a.~A(); // Wrong - Member identifier expected
a.A::~A(); // Valid
但是我没有Turbo C ++编译器来测试它,所以你必须测试它。
<强> [编辑] 强>
OP测试了它,它有效。
答案 2 :(得分:3)
虽然@billz是正确的,你不必明确地调用它,但行本身应该是有效的。析构函数是一种常规方法,可以像这样调用。如果您实施自己的operator new
和operator delete
,这可能很有用,但在您的情况下,只需坚持使用billz答案。
导致错误消息的问题似乎是您有一个过于旧的编译器,<iostream.h>
或void main()
证明了这一点。修复旧学校的东西(但不是a.~A();
)代码用GCC 4.8编译。
答案 3 :(得分:1)
根据您的要求,以下代码效果很好
#include <iostream>
class A
{
public:
A() { }
~A() { std::cout<<"\n ~A()"; }
};
int main()
{
A a;
a.A::~A();
return 0;
}
但要注意明确地呼唤D'tor。因为编译器会插入函数内部的自动对象的代码。在上面的代码中将导致调用D'tor两次,即
int main()
{
A a;
a.A::~(); //which we provided
a.A::~(); // provided by the compiler for auto objects
return 0;
}
我们必须仅为placment new运算符here for more details明确调用D'tor。
答案 4 :(得分:0)
如果编译器不允许显式析构函数调用的标准语法,那么它可能不允许你这样做。
你的编译器大约有二十年了,从那以后语言至少经过了两次重大修改。我没有足够的历史知识(或兴趣)知道它的方言是否应该允许明确的破坏;但如果你想编写现代(ish)C ++,那么你需要一个现代(ish)编译器。