• 对象析构不析构?


    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;
    }

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

  • 相关阅读:
    Bootstrap中,模态框嵌套模态框时,关闭第二个模态框时,导致第一个模态框的滚动条消失
    heidisql 远程登录本地虚拟机中的 MariaDB
    ssh-keygen -t rsa -C "content" 解释
    IIS 环境 CodeIgniter 隐藏 URL 中的 index.php
    Windows 环境下 PHP 安装 xdebug 及配置
    win10 更新后主机背部音频输出无声音
    MySql.Data.MySqlClient.MySqlException: Packets larger than max_allowed_packet are not allowed
    关于 IIS 中 iconfont.woff 报 404(Not Found) 的原因即解决方法
    IIS Web API 长时间不连接后第一次访问非常缓慢
    VS Code 中 HTML 文档注释 js 语句异常
  • 原文地址:https://www.cnblogs.com/sigma0-/p/12630475.html
Copyright © 2020-2023  润新知