2 ssfxtrleaf ssfxtrleaf 于 2016.02.10 15:36 提问

c++ static 类实例 是否调用折构函数?
c++

比如说static MyClass myclass;
myclass的折构函数会不会被调用?

5个回答

caozhy
caozhy   Ds   Rxr 2016.02.10 21:11

会调用,但是可能不会再控制台输出

在VC++中编写如下代码:

 #include <iostream>
using namespace std;

class A
{
public:
    ~A() { cout << "~A" << endl; }
};

static A a;

int main(int argc, char* argv[])
{
    return 0;
}

在 ~A() { cout << "~A" << endl; }上点右键,选择添加断点

按f5或者“开始调试”。

程序会停在这一行。说明它的确是执行了的。但是此时控制台已经销毁,所以没有输出。

caozhy
caozhy 回复ysuwood: 的确是
接近 2 年之前 回复
qq_27183003
qq_27183003 单步运行,控制台有输出的。把~A() { cout << "~A" << endl; }分成多行再单步运行,就计较容易看到。
接近 2 年之前 回复
qq_27183003
qq_27183003   Ds   Rxr 2016.02.11 09:07

static用在类对象前面和用在普通变量前的作用是一样的。
static有两种用途,可参考:
http://blog.csdn.net/qq_27183003/article/details/49886843
析构函数会被调用。

 #include <iostream>
using namespace std;

class A
{
public:
    A(){ cout<<"A"<<endl; }
    ~A() { cout << "~A" << endl; }
};


void fun()
{
    static A a;

}
int main(int argc, char* argv[])
{
    fun();
    fun();
    fun();
    return 0;
}

caozhy
caozhy
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.10 21:12

图片说明

注意看红色圆圈中的黄色箭头。

NK_test
NK_test   Rxr 2016.02.15 19:51

会的,离开作用域就会调用

91program
91program   Ds   Rxr 2016.02.10 16:32

静态变量的作用域是整个程序的生存时间,所以就算调用类的析构函数,也是在应用退出时。
你可以增加 LOG 看看在程序退出时,类的析构函数会不会被调用:即有没有增加的 LOG 输出。应该是有的。

ssfxtrleaf
ssfxtrleaf 没有啊。。。难道不会被调用吗?。。。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!