美文网首页
内存管理

内存管理

作者: 食梦狸猫 | 来源:发表于2019-04-11 12:54 被阅读0次

    RAII机制

    资源获取即初始化:在使用资源的类的构造函数中申请资源,然后最后在析构函数中释放。

    scoped_ptr

    这个智能指针只能在本作用域使用,不希望被转让。
    scope_ptr将拷贝构造函数和赋值操作符声明为私有的,禁止拷贝。成员函数get()返回内部保存的原始指针,但要注意不要对这返回的指针做delete,因为scope_ptr析构的时候会自动进行释放,以防止重复释放。

    scoped_ptr<string> sp(new string("text"));
    assert(sp);
    //scoped_ptr<string> sp2 = sp 
    //拷贝构造不被允许。
    

    unique_ptr

    unique_ptr和scoped_ptr一样,在作用域里管理指针,不允许拷贝构造和拷贝赋值。但unique_ptr可以像原始指针一样进行比较。

    scoped_array

    包装了new[]操作符,给动态数组提供了一个代理。构造函数接受的指针必须是new[]的结果,没有begin(),end()

    scoped_array<int> sa(new int[100]);
    unique_ptr<int[]> up(new int [100]);
    

    使用情况

    scoped_array没有给程序额外负担,方便轻巧。但功能有限。

    shared_ptr

    shared_ptr实现的是引用计数型的智能指针,可以被自由拷贝赋值,在任意的地方共享它,只有当引用计数为0时,才删除被包装的动态分配的对象。

    shared_ptr<int> spi(new int);
    shared_ptr<int> do(new int[10]);
    

    unique()在shared_ptr是指针的唯一所有者时返回true,use_count()返回当前指针的引用计数。

    工厂函数

    make_shared()库用来消除显式的new调用。make_shared接受若干个参数,创建一个shared_ptr<T>对象返回,因为其内部只分配一次内存,通常要比直接创建shared_ptr对象更快且高效。

    auto so = make_shared<string>("make_shared");
    

    应用于标准容器

    • 将容器作为shared_ptr的管理对象,使容器可以更安全的共享。
    shared_ptr<list<T>>
    
    • 将shared_ptr作为容器元素
    vector<shared_ptr<T>>
    

    应用于桥接模式

    桥接模式及是一种结构型设计模式,把类的具体实现细节对用户隐藏起来,以达到类之间的最小耦合。
    比如一个内部类例子。

    class sample
    {
     private:
          class impl;
          shared_ptr<impl> p;
      public:
           sample();
           void print();
    };
    
    class sample::impl
    {
      public:
        void print()
            { cout<<"print"<<endl;}
    };
    
    sample::sample():p(new impl){}
    
    void sample::print()
    { p->print();}
    }
    

    应用于工厂模式

    工厂模式是一种创建型设计模式,这个模式包装new操作符的使用,使对象的创建工作集中在工厂类或者工厂函数中。make_shared就是一个例子。

    shared_array

    int* p = new int [100];
    shared_array<int> sa(p);
    
    

    相关文章

      网友评论

          本文标题:内存管理

          本文链接:https://www.haomeiwen.com/subject/rltxiqtx.html