#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
答案 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)
如果您将该代码放入函数中,则可以预先看到localObj的破坏,因为它在您离开函数后会超出范围:
void f(){
Tester localObj(3);
cout<<"In local function f";
}
/*...*/
int main(){
f();
system("pause");
return 0;
}
答案 8 :(得分:0)
你的析构函数是在
之后被调用的返回0;
因此你没有看到析构函数做了什么。 但它仍在运行,你只是看不到它。
如果您在VStudio中,可以按CTRL + F5,程序终止后会添加“按任意键继续”。