4

我试图在 Turbo C++ 中显式调用类的析构函数:

A a;
a.~A();

但它显示一个错误:

需要成员标识符。

有没有办法在 Turbo C++ 中显式调用析构函数?

4

5 回答 5

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.
于 2013-09-18T11:07:36.250 回答
5

这个链接,看起来你真的可以做到,有效的格式是:

A a;
// a.~A(); // Wrong - Member identifier expected
a.A::~A(); // Valid

但是我没有方便的 Turbo C++ 编译器来测试它,所以你必须测试它。

[编辑]

OP对其进行了测试,它可以工作。

于 2013-09-18T11:56:51.660 回答
3

虽然@billz 是正确的,您不必显式调用它,但该行本身应该是有效的。析构函数是一种常规方法,可以这样调用。如果您实现自己的,这可能很有用operator newoperator delete但在您的情况下,请坚持使用 billz 答案。

导致错误消息的问题似乎是您的编译器太旧,如 or 所证明的<iostream.h>那样void main()。修复老式的东西(但不是a.~A();),代码使用 GCC 4.8 编译。

于 2013-09-18T11:10:27.377 回答
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;
 }

我们必须在此处为放置new 运算符显式调用 D'tor 以获取更多详细信息。

于 2013-09-18T12:57:40.333 回答
0

如果编译器不允许显式析构函数调用的标准语法,那么它可能不允许您这样做。

你的编译器大约有 20 年的历史了,从那时起,该语言至少经历了两次重大修订。我没有足够的历史知识(或兴趣)来知道它的方言是否应该允许明确的破坏;但是如果你想编写现代(ish)C++,那么你需要一个现代(ish)编译器。

于 2013-09-18T11:56:33.127 回答