• 对象析构不析构?


    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<<"----------------------------------------
    ";
        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<<"子函数----------------------------------------
    ";
    }
    int main(int argc, char const *argv[])
    {
    
        // lcw_xg test_1;//声明一个测试类
        lcw_test();
        cout<<"主函数----------------------------------------
    ";
    
        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<<"----------------------------------------
    ";
    
        return 0;
    }

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

  • 相关阅读:
    TCP为什么是个可靠的协议
    socket网络编程快速上手(二)——细节问题(4)
    socket网络编程快速上手(二)——细节问题(3)
    socket网络编程快速上手(二)——细节问题(2)
    socket网络编程快速上手(二)——细节问题(1)
    socket网络编程快速上手(一)
    多线程编程中使用pthread_create内存泄露问题
    股市量化智能分析2035
    忘记mysql root密码的解决方法
    CentOS 下快速安装部署Nginx网站
  • 原文地址:https://www.cnblogs.com/sigma0-/p/12630475.html
Copyright © 2020-2023  润新知