деструктор не работает? - PullRequest
2 голосов
/ 27 июня 2011
#include <iostream>

using namespace std;

class Tester {
public:
Tester(int x);
~Tester();
int who;
} Tester_g_1(1) , Tester_g_2(2);

Tester::Tester(int id) {
cout << "Intializing" << id << endl ;
who = id;
}

Tester::~Tester() {
cout << "Destroying" << who << endl;
}

int main() {
Tester localObj(3);
cout << "This is not the first line to be displayed";
    system("pause");
return 0;

}

Вывод, который я получаю:

Intializing1
Intializing2
Intializing3
This is not the first line to be displayedPress any key to continue . . .

Почему оператор в деструкторе не работает? В использовании : Компилятор - Microsoft Visual C ++ 2010 Express ОС - Win7

Ответы [ 9 ]

10 голосов
/ 27 июня 2011

localObj уничтожается, когда заканчивается main (потому что это его область действия), что происходит после system("pause").Вы нажимаете клавишу, деструктор запускается, но сразу же окно закрывается, поэтому вы его не видите.

Чтобы увидеть текст деструктора, вы должны запустить программу из командной строки или использоватьПункт «Запустить программу без отладки» из меню «Выполнить» (IIRC меню VS) (горячая клавиша для этого - Ctrl + F5 - спасибо @Cody Grey).Это добавляет «Нажмите любую клавишу для продолжения» после завершения исполняемого файла, так что вы сможете увидеть текст, написанный деструктором.

Еще один способ увидеть запуск деструктора - заключить переменную вменьший объем, который вы можете легко сделать так:

// ...

int main() {
    {    // the braces create a new scope...
        Tester localObj(3);
        cout<<"Inside the Tester scope..."<<endl;
    }    // ... that ends here
    cout << "... outside the Tester scope!";
    cout<<"Press Enter to exit...";
    cin.ignore();
    return 0;
}

Кстати, system("pause") уродлив и непереносим;вам следует избегать этого.

4 голосов
/ 27 июня 2011

Переменная уничтожается в конце области.

Для него фактически уничтожено ПОСЛЕ паузы, так что вы, вероятно, просто не видите его.

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

4 голосов
/ 27 июня 2011

Деструкторы вызвали после Press any key to continue . . .

3 голосов
/ 27 июня 2011

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

2 голосов
/ 27 июня 2011

Ваш объект еще не вышел за рамки.Вы все еще зависаете при вызове system.

Вы можете ввести новую область видимости с помощью пары скобок:

{
   Tester localObj(3);
   cout << "This will be run before the destructor." << endl;
}

или запустить программу в командной строке (запустите cmd.exe, затем запустите программу из командной строки.), что даст вам достаточно времени, чтобы увидеть выходные данные вашего деструктора.

1 голос
/ 27 июня 2011

Объекты, созданные в стеке, автоматически уничтожаются при выходе из области видимости.Чтобы доказать это для вашей локальной переменной, вы могли бы использовать фиктивную область видимости внутри вашей main():

int main() 
{
   {
      Tester localObj(3);
   }

   cout << "This is not the first line to be displayed";
   system("pause");
   return 0;
}

Глобальные переменные, которые вы создали в стеке, уничтожаются сразу после возврата main() (но до std::coutуничтожен).

1 голос
/ 27 июня 2011

Потому что вы не уничтожаете объект.Пока он остается в области видимости, нет причин, по которым следует вызывать деструктор.

Попробуйте вместо этого:

void someOtherFunction(){
Tester localObj(3);
}

int main() {
someOtherFunction();
cout << "This is not the first line to be displayed";
    system("pause");
return 0;

}

Или вы также можете выделить объект в куче (в отличие от использования стека, как в примере выше):

Tester* tester=new Tester(3);
delete tester;
0 голосов
/ 12 июня 2014

Ну, ваш деструктор вызывается после того, как

вернет 0;

Следовательно, вы не видели, что сделал деструктор.Но он все еще работает, вы просто его не видите.

Если вы находитесь в VStudio, вы можете нажать CTRL + F5, после добавления вашей программы будет добавлено «Нажмите любую клавишу для продолжения».

0 голосов
/ 27 июня 2011

Скорее всего, он действительно показывает, но у вас нет достаточно времени, чтобы увидеть, как это происходит (уничтожение произойдет во время оператора "return 0;" ".

Предзаказ, если вы поместите этот кодв функцию, вы сможете увидеть разрушение localObj, так как оно выйдет из области видимости после выхода из функции:

void f(){
    Tester localObj(3);
    cout<<"In local function f";
}

/*...*/ 

int main(){
    f();
    system("pause");
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...