我试图在 Turbo C++ 中显式调用类的析构函数:
A a;
a.~A();
但它显示一个错误:
需要成员标识符。
有没有办法在 Turbo C++ 中显式调用析构函数?
我试图在 Turbo C++ 中显式调用类的析构函数:
A a;
a.~A();
但它显示一个错误:
需要成员标识符。
有没有办法在 Turbo C++ 中显式调用析构函数?
你不需要显式调用析构函数,当一个对象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.
从这个链接,看起来你真的可以做到,有效的格式是:
A a;
// a.~A(); // Wrong - Member identifier expected
a.A::~A(); // Valid
但是我没有方便的 Turbo C++ 编译器来测试它,所以你必须测试它。
[编辑]
OP对其进行了测试,它可以工作。
虽然@billz 是正确的,您不必显式调用它,但该行本身应该是有效的。析构函数是一种常规方法,可以这样调用。如果您实现自己的,这可能很有用operator new
,operator delete
但在您的情况下,请坚持使用 billz 答案。
导致错误消息的问题似乎是您的编译器太旧,如 or 所证明的<iostream.h>
那样void main()
。修复老式的东西(但不是a.~A();
),代码使用 GCC 4.8 编译。
根据您的要求,以下代码效果很好
#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;
}
我们必须在此处为放置new 运算符显式调用 D'tor 以获取更多详细信息。
如果编译器不允许显式析构函数调用的标准语法,那么它可能不允许您这样做。
你的编译器大约有 20 年的历史了,从那时起,该语言至少经历了两次重大修订。我没有足够的历史知识(或兴趣)来知道它的方言是否应该允许明确的破坏;但是如果你想编写现代(ish)C++,那么你需要一个现代(ish)编译器。