• C++以对象管理资源


    先看下面一段代码:

    class Node {};
    
    Node* CreateNode()
    {
        
    }
    
    void Solve()
    {
        Node *p=CreateNode();  //调用CreateNode函数
        ...
        delete p;         //释放资源
    }

    这样释放资源(delete)做法是正确的。

    但是,我们怎么能保证其他人在利用这个代码时在delete之前会不会使用continue语句或者return语句跳过delete,这样一来的话不就无法释放资源浪费资源了吗。

    有什么办法呢?即在程序结束之前一定会自动释放资源。

    auto_ptr(智能指针):其析构函数自动对其所指的函数调用delete。

    void Solve()
    {
        std::auto_prt<Node>p(CreateNode());
        ...                    ///经由auto_ptr析构函数自动删除p对象
    }

    它还有另外一个性质:即通过copy构造函数或者copy assignment函数对他们进行复制操作时,它们会变成null,而复制所得的指针将拥有对资源的唯一支配权。

    void Solve()
    {
        std::auto_prt<Node>p1(CreateNode());
        std::auto_prt<Node>p2(p1);  //p2指向对象,p1为null
        p1=p2;                      //p1指向对象,p2为null
    }

    通过上面的例子藐视auto_ptr智能指针的弊端已经显露出来了,即无法行使正常的复制行为。

    怎么办?看下面。

    tr1::shared_ptr(引用计数智慧指针):它不仅拥有auto_ptr智能指针的功能,最重要的是它还能进行复制行为。

    void Solve()
    {
        std::tr1::shared_ptr<Node>p1(CreateNode());
        std::tr1::shared_ptr<Node>p2(p1);  //p1和p2指向同一对象
        p1=p2;           //p1和p2指向同一对象
        ...             //p1,p2同时被销毁,它们所指的对象也被自动销毁
    }

    记住:

    1、为防止资源泄露,请使用RAII对象。它们在构造函数过程中获得资源,并在析构函数过程中释放资源。

    2、两个常用的RAII classes分别是auto_ptr,tr1::shared_ptr,后者更佳。

  • 相关阅读:
    mysql 字符串先按照长度排序再按照ASCII码排序
    JMeter 压力测试文档
    Linux C监听鼠标键盘操作
    ubuntu 笔记本触摸板失灵
    git commit之后,想撤销commit
    清空iptables防火墙
    在k8s中搭建sonarqube并集成到jenkins
    redis集群搭建
    四叶草防火墙内外网映射
    k8smaster节点更换ip
  • 原文地址:https://www.cnblogs.com/kane0526/p/3612428.html
Copyright © 2020-2023  润新知