Как явным образом вызвать деструктор класса в Turbo C++


Я пытаюсь вызвать деструктор класса явно в Turbo C++:

A a;
a.~A();

Но он показывает ошибку:

Ожидается идентификатор члена.

Существует ли способ явного вызова деструктора в Turbo C++?

5 4

5 ответов:

Из этой ссылки, кажется, вы действительно можете это сделать, допустимый формат:

A a;
// a.~A(); // Wrong - Member identifier expected
a.A::~A(); // Valid
Но у меня нет под рукой компилятора Turbo C++ для его тестирования, так что вам придется его протестировать.

[Edit]

ОП протестировал его, он работает.

Вам не нужно вызывать деструктор явно, когда объект с 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.

Хотя @billz прав, что вам не нужно вызывать его явно, сама строка должна быть допустимой. Деструктор-это обычный метод, и его можно вызвать подобным образом. Это может быть полезно, если вы реализуете свои собственные operator new и operator delete, но в вашем случае просто придерживайтесь ответа billz.

Проблема, которая приводит к сообщению об ошибке, по-видимому, заключается в том, что у вас слишком старый компилятор, о чем свидетельствуют <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;
  }

Но остерегайтесь явного вызова Д'Тора. Потому что компилятор вставит код для автоматического obejcts, которые находятся внутри функции. В приведенном выше коде результатом будет вызов D'Tor дважды т. е.

 int main()
 {
   A a;
   a.A::~(); //which we provided
   a.A::~(); // provided by the compiler for auto objects
   return 0;
 }

Мы должны явно вызвать D'Tor только для оператора placment new здесь для более подробной информации.

Если компилятор не разрешает стандартный синтаксис для явного вызова деструктора, то он, вероятно, не позволит вам сделать это.

Вашему компилятору около двадцати лет, и с тех пор язык прошел по крайней мере две серьезные ревизии. У меня недостаточно исторических знаний (или интереса), чтобы знать, допускает ли его диалект явное разрушение; но если вы хотите написать современный(ish) C++, вам понадобится современный(ish) компилятор.