对象析构不析构?

来源:互联网 发布:淘宝网购物 编辑:程序博客网 时间:2024/05/16 16:19

C++中的默认构造函数还有析构函数都是默认在“适当的时机”被调用的,这在一般的编程中似乎是比较明了的。《C++ Primer》作者Stanley B.Lippman说”C++保证,一定会在main()函数中第一次使用全局对象之前,把它构造出来,而在main()函数结束之前,把它摧毁掉!”,那么自然的,在对象被构造的时候,调用构造函数,main函数结束之前调用析构函数将对象销毁,下面这个简单的例子也是说明了这样的结果:

//start from the very beginning,and to create greatness//@author: Chuangwei Lin//@E-mail:979951191@qq.com//@brief: 析构函数学习#include <iostream>using namespace std;class lcw_xg{public:    lcw_xg()    {        cout<<"lcw_xg对象构造完成"<<endl;    }    ~lcw_xg()    {        cout<<"lcw_xg对象析构完成"<<endl;    }    int i;};int main(int argc, char const *argv[]){    lcw_xg test_1;//声明一个测试类    cout<<"----------------------------------------\n";    return 0;}

结果如下:
这里写图片描述
这样确实是在main函数结束之前(结束时)才将对象析构的,因为打印的横线出现在析构之前,但是在打印横线的时候其实该该对象已经是没有作用的了,也就是说,test_1对象的作用域其实在横线打印前。
如果是局部对象呢,看看下面的例子

#include <iostream>using namespace std;class lcw_xg{public:    lcw_xg()    {        cout<<"lcw_xg对象构造完成"<<endl;    }    ~lcw_xg()    {        cout<<"lcw_xg对象析构完成"<<endl;    }    int i;};void lcw_test(){    lcw_xg test_2;      cout<<"子函数----------------------------------------\n";}int main(int argc, char const *argv[]){    // lcw_xg test_1;//声明一个测试类    lcw_test();    cout<<"主函数----------------------------------------\n";    return 0;}

结果如下:
这里写图片描述
该结果说明局部对象的析构是在子函数结束之前(结束之时)
在学习muduo库的时候,MutexLockGuard对象是一个掌管着互斥区加解锁的对象,并且使用RAII技法封装,即在对象构造的时候加锁,在对象析构的时候解锁,如果是在函数中想要上锁一小句代码,比如一个变量的自加操作,而后面的代码全部都是不加锁的,但是解锁的操作时发生在MutexLockGuard对象被析构的时候的,而一般情况下对象的作用域是比较长的,一般对象的析构是发生在所在函数结束的时候,所以简单的加上MutexLockGuard语句的话会造成后面的代码全被加锁了,这是与我们的期望不相符的,所以这个时候应该使用{}来界定对象的作用域,如下面例子:

#include <iostream>using namespace std;class lcw_xg{public:    lcw_xg()    {        cout<<"lcw_xg对象构造完成"<<endl;    }    ~lcw_xg()    {        cout<<"lcw_xg对象析构完成"<<endl;    }    int i;};int main(int argc, char const *argv[]){    {      lcw_xg test_1;//声明一个测试类        }    cout<<"----------------------------------------\n";    return 0;}

该代码只是比第一个例子多用了一个{},结果如下:
这里写图片描述
使用{}将对象的作用域界定在了大括号中,用起来就不会那么纠结了。

0 0
原创粉丝点击