在Geeks上看到一题,很是费解:关于C++的显式/隐式调用构造和析构函数。

海里没泡泡 发布于 2015/05/04 19:09
阅读 577
收藏 0

第一个问题:

#include <iostream>

using namespace std;


class Test
{
public:
    Test()  { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n";  }
};


int main()
{
    Test();  // Explicit call to constructor
    Test t; // local object
    t.~Test(); // Explicit call to destructor
    return 0;

}

执行以上代码出现:

Constructor is executed
Destructor is executed

Constructor is executed
Destructor is executed

Destructor is executed

但是以下代码:

#include <iostream>
using namespace std;


class Test
{
public:
    Test()  { cout << "Constructor is executed\n"; }
    ~Test() { cout << "Destructor is executed\n";  }
};


int main()
{
    Test();  // Explicit call to constructor
    Test t; // local object
   // t.~Test(); // Explicit call to destructor
    return 0;
}
去掉红色部分后,出现结果为:

Constructor is executed
Destructor is executed

Constructor is executed

但是,我调试发现其实最后的析构有执行,但是为什么没显示“Destructor is executed”这条语句呢?

第二个问题:

另外一个例子:

#include <iostream>
using namespace std;


class Test
{
public:
    Test()  

cout << "Constructor is executed\n"; 
}
    ~Test() 

cout << "Destructor is executed\n";  
}
    void show()  
{  
Test();  
this->Test::~Test();  
}
};


int main()
{
    Test t;
    t.show();
    return 0;
}
执行代码后出现

Constructor is executed

Constructor is executed
Destructor is executed

Destructor is executed

Destructor is executed

删掉this后:

#include <iostream>
using namespace std;


class Test
{
public:
    Test()  

cout << "Constructor is executed\n"; 
}
    ~Test() 

cout << "Destructor is executed\n";  
}
    void show()  
{  
Test();  
Test::~Test();  
}
};


int main()
{
    Test t;
    t.show();
    return 0;
}

结果为

Constructor is executed

Constructor is executed
Destructor is executed

Destructor is executed

但是调试发现还是执行了最后的析构,也就是说析构3次了,为什么也没显示出“Destructor is executed”呢?

加载中
1
s
sw55555
你在cout最后加个endl试试,感觉你是没有刷新输出导致打印的字符没有显示
海里没泡泡
海里没泡泡
差不多是这个意思,而且我发现不能使用getchar或者system(“pause”),只能ctrl+f5才能正确输出,否则需要再按一次键盘,才能出现最后一个析构! 谢啦!!
0
甘薯
甘薯

你是如何确定析构被执行了? 我感觉C++编译器并不保证一定会调用析构函数, 尤其是在要退出程序的时候.析构函数已经变得毫无意义, 有可能会被月优化掉.我不知道你的编译参数是什么, 你把所有的优化选项都关闭掉, 看看最后的结果是什么? 

海里没泡泡
海里没泡泡
优化是关掉的。 然后我是在调试状态下进入代码内部,发现函数有跳到析构语句那一条。
0
m
magiclogy
用的什么编译器?第二第三种情况,我都比你多输出一次Destructor is executed
海里没泡泡
海里没泡泡
我用的是VS2010,看来编译器有问题。 ​是不是只要执行了析构就会在某些编译器上显示呢? 我换个编译器试试!
返回顶部
顶部