对象析构不析构?
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;
}
该代码只是比第一个例子多用了一个{},结果如下:
使用{}将对象的作用域界定在了大括号中,用起来就不会那么纠结了。