内存管理
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的管理对象,使容器可以更安全的共享。
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);