析构函数不起作用?

时间:2011-06-27 14:17:34

标签: c++ visual-c++

#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 . . .

为什么析构函数dodes中的语句不起作用? 正在使用 : 编译器 - microsoft visual c ++ 2010 Express 操作系统 - Win7

9 个答案:

答案 0 :(得分:10)

localObj终止时(因为它的范围),

main被破坏,在<{em> system("pause")之后发生。你按一个键,析构函数会运行,但窗口会立即关闭,所以你看不到它。

要查看析构函数的文本,您必须从命令行运行程序,或使用“运行”菜单中的“启动程序而不调试”项目(IIRC VS菜单)(热键为 Ctrl + F5 - 谢谢@Cody Gray)。在可执行文件终止后,这会添加“按任意键继续”,这样您就可以看到析构函数写入的文本。

查看析构函数运行的另一种方法是将变量封装在较小的范围内,您可以这样轻松地执行此操作:

// ...

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")是丑陋且不便携的;你应该避免它。

答案 1 :(得分:4)

析构函数在Press any key to continue . . .

之后调用

答案 2 :(得分:4)

变量在范围的末尾被销毁。

它实际上在暂停后被销毁了,所以你可能只是看不到它。

如果您将在命令提示符中运行它,您将看到该行。

答案 3 :(得分:3)

在暂停运行时,对象尚未超出范围,因此不会调用其析构函数。不要使用暂停,只需从命令行运行程序,这样就可以看到完整的输出,你会看到它被调用。

答案 4 :(得分:2)

您的对象尚未超出范围。您仍然在system电话中闲逛。

您可以使用一对括号引入新范围:

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

或在命令行提示符下运行程序(运行cmd.exe,然后从提示符启动程序。),这样就有足够的时间查看析构函数的输出。

答案 5 :(得分:1)

因为你没有摧毁这个物体。只要它仍然在范围内,就没有理由为什么要调用析构函数。

请改为尝试:

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;

答案 6 :(得分:1)

在堆栈上创建的对象在超出范围时会自动销毁。要为您的局部变量证明这一点,您可以在main()

中使用虚拟范围
int main() 
{
   {
      Tester localObj(3);
   }

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

main()返回后(但在std::cout被销毁之前),您在堆栈上实例化的全局变量将被销毁。

答案 7 :(得分:0)

它有可能显示,但你没有足够的时间看到它发生(破坏将发生在“return 0;”声明中。“

如果您将该代码放入函数中,则可以预先看到localObj的破坏,因为它在您离开函数后会超出范围:

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

/*...*/ 

int main(){
    f();
    system("pause");
    return 0;
}

答案 8 :(得分:0)

你的析构函数是在

之后被调用的
  

返回0;

因此你没有看到析构函数做了什么。 但它仍在运行,你只是看不到它。

如果您在VStudio中,可以按CTRL + F5,程序终止后会添加“按任意键继续”。