智能指针使用陷阱
1、不能把一个原生指针交给多个智能指针管理
int *x = new int(10);
unique_ptr<int> up1(x);
unique_ptr<int> up2(x);
//警告! 以上代码使 up1 up2 指向同一个内存,非常危险,如果up1被释放,up2就指向空地址
或以下形式:
up1.reset(x);
up2.reset(x);
2、使用 u.release()的返回值
在调用 u.release()时是不会释放 u 所指的内存的,这时返回值就是对这块内存的唯一索引,如果没有使用这个返回值释放内存或是保存起来,这块内存就泄漏了
3、禁止 delete 智能指针 get 函数返回的指针
如果我们主动释放掉 get 函数获得的指针,那么智能 指针内部的指针就变成野指针了,析构时造成重复释放,带来严重后果!
4、禁止用任何类型智能指针 get 函数返回的指针去初始化另外一个智能指针
shared_ptr<int> sp1(new int(10));
//一个典型的错误用法 shared_ptr<int> sp4(sp1.get());