刚看到c++中智能指针,总结下
首先说一下为什么会出现智能指针
void remodel(std::string & str)
{
std::string * ps = new std::string(str);
...
str = ps;
return;
}
以上面这段C Prime plus的代码为例,问题很简单,分配了堆上的空间而没有进行回收导致内存泄露。ps这个指针变量分配在栈上面,函数退出时存放指针的内存被释放,但是ps指针指向的堆空间内存却没有进行回收,ps不是类对象,在函数退出的时候无法调用类的析构函数,智能指针想要解决这个问题,即想在指针过期时,释放掉它所指向的类对象。
具体的使用方法不想赘述,希望记录下使用这些智能指针的注意事项和区别。
①所有智能指针类都是一个explicit构造函数,该构造函数将指针作为参数,因此不需要自动将指针转化为智能指针类型,如
shared_ptr<double> pd;
double *p_reg = new double;
pd = p_reg;
shared_ptr<double> pshared = p_reg;
这两种赋值方式都是不允许的。
②auto_ptr,unique_ptr,shared_ptr区别
a.对于auto_ptr,unique_ptr,他们有所有权的概念,只有拥有对象的智能指针的构造函数会删除对象,赋值操作会转让所有权。
auto_ptr<string> p1(new string("heiworld");
auto_ptr<string> p2 ;
p2 = p1 //p1的所有权转给p2
cout << *p1 //p1已经丧失所有权,访问出错
auto_ptr会在程序的运行过程中出错,但假如上面的列子中用的是unique_ptr,那在编译的过程中就会出错,所以unique_ptr更安全。
如果赋值的过程中创建的是临时值,那无论是auto_ptr还是unique_ptr,都是允许的。比如
unique_ptr<string> p1 ;
p1 = unique_ptr<string> new string("heiworld");
shared_ptr<string> p1(new string("heiworld");
shared_ptr<string> p2 ;
p2 = p1;
cout << *p1;
所以加入程序要使用多个指向同一个对象的指针应该选择shared_ptr,比如很多STL算法都支持复制和赋值操作,这些操作可用于shared_ptr,但不能用于unuque_ptr和auto_ptr。