如何在Turbo C ++中显式调用类的析构函数

时间:2013-09-18 11:06:08

标签: c++ compiler-errors destructor turbo-c++

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

A a;
a.~A();

但它显示错误:

  

预期会员标识符。

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

5 个答案:

答案 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 newoperator 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)编译器。