内存管理

2019-04-11  本文已影响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<list<T>>
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);

上一篇下一篇

猜你喜欢

热点阅读