【问题标题】:How to explicitly call destructor of a class in Turbo C++如何在 Turbo C++ 中显式调用类的析构函数
【发布时间】:2013-09-19 17:04:44
【问题描述】:

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

A a;
a.~A();

但它显示错误:

需要成员标识符。

有什么方法可以在 Turbo C++ 中显式调用析构函数?

【问题讨论】:

  • 它在这个千年的编译器上编译得很好coliru.stacked-crooked.com/a/c04b9139cc4e8794(虽然它有未定义的行为,但那是另一回事)
  • 当对象超出范围时将自动调用析构函数(在您的情况下,当主函数的执行完成时,因为amain 中的局部变量)。你不需要显式调用它。
  • 为什么要显式调用析构函数?
  • @ShreyasA:是的,你的编译器太旧了。就像没有人再使用 MS-DOS 一样,你不应该使用它。
  • @ShreyasA 考虑将该编译器捐赠给某个博物馆,他们可能会很高兴再次看到其中一个;)(注意:无意冒犯。尝试 GCC 或 LLVM/Clang,这些是状态-最先进的编译器,它们是免费的)。

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


【解决方案1】:

来自this link,看来你确实可以做到,有效格式为:

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

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

[编辑]

OP 测试过,它可以工作。

【讨论】:

  • 顺便说一句,我已经对您的问题进行了一些编辑,编辑是否很好,是否反映了您想问的问题?
  • 是的,它小巧而精确。虽然我已经添加了析构函数标签
【解决方案2】:

你不需要显式调用析构函数,当一个带有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.

【讨论】:

  • 正确,但没有回答问题。
  • @Walter 我错过了什么?
  • 是的,这是正确的,但看看这个stackoverflow.com/questions/11884168/…
  • 我才意识到没有问题...应该关闭它。无论如何,我理解这个问题是为什么我的尝试没有显式调用析构函数(在这个特定的例子中没有意义,但在其他情况下可能有用)。
  • 我认为这是一个很好的答案。这个问题似乎是一个 XY 问题。
【解决方案3】:

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

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

【讨论】:

  • 是的,我认为这就是原因,因为coliru.stacked-crooked.com/a/c04b9139cc4e8794 运行良好
  • 我认为a.~A();导致虚拟析构函数调用和 a.A::~A();导致非虚拟析构函数调用。
  • @Johny 仅当~A 是虚拟的,而在 OPs 示例中它不是。如果它是虚拟的,你是对的,但我也看不出这与这里有什么关系。
  • a.~A() 没有什么新鲜事。这在我早在 1991 年就在使用的编译器中有效。(IIRC,g++ 有一个错误,这意味着它无法使用它。但这个错误已经在很久以前修复了。)
  • @JamesKanze 我并不是在暗示它是新的,我只是说这样一个基本领域的错误更有可能是由旧编译器引起的。其他人已经评论过,这个千禧年的编译器对此没有任何问题。 :)
【解决方案4】:

根据您的要求,以下代码运行良好

 #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;
 }

我们必须只为放置新操作符here for more details 显式调用 D'tor。

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

    • 至少从 CFront 2.1(1980 年代后期)开始,该语言就出现了显式破坏。 IIRC,g++ 有一个错误,这意味着您必须编写 a.A::~A(),但那将是版本 1.49 或 2.1.2;它肯定在 2.95.2 (或类似的东西)中工作。我们现在大约是 4.8,这意味着它已经修复了很长时间。
    • @JamesKanze:感谢历史背景;因此,问题似乎在于这个古老的编译器所采用的任何方言,而不是当时的“官方”语言。但是我的回答的要点仍然是:如果您需要现代(ish)程序员的帮助,请使用现代(ish)编译器来构建现代(ish)语言。
    • 是的。我不喜欢使用最新编译器的最新特性(一般来说),但这个特性是在大约 15 年前随着operator newoperator delete 的用户重载而引入的。 (在我们的领域,15 年是永恒的。)
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 2021-01-28
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多