首页 > 代码库 > shared_ptr 和 unique_ptr
shared_ptr 和 unique_ptr
c++11标准废除乐auto_ptr,
C++ 标准库智能指针
使用这些智能指针作为将指针封装为纯旧 C++ 对象 (POCO) 的首选项。
-
unique_ptr
只允许基础指针的一个所有者。 除非你确信需要 shared_ptr,否则请将该指针用作 POCO 的默认选项。 可以移到新所有者,但不会复制或共享。 替换已弃用的auto_ptr。 与 boost::scoped_ptr 比较。 unique_ptr 小巧高效;大小等同于一个指针且支持 rvalue 引用,从而可实现快速插入和对 STL 集合的检索。 头文件:<memory>。 有关更多信息,请参见如何:创建和使用 unique_ptr 实例和unique_ptr 类。 -
shared_ptr
采用引用计数的智能指针。 如果你想要将一个原始指针分配给多个所有者(例如,从容器返回了指针副本又想保留原始指针时),请使用该指针。 直至所有shared_ptr 所有者超出了范围或放弃所有权,才会删除原始指针。 大小为两个指针;一个用于对象,另一个用于包含引用计数的共享控制块。 头文件:<memory>。 有关更多信息,请参见如何:创建和使用 shared_ptr 实例和shared_ptr 类。 -
weak_ptr
结合 shared_ptr 使用的特例智能指针。 weak_ptr 提供对一个或多个 shared_ptr 实例拥有的对象的访问,但不参与引用计数。 如果你想要观察某个对象但不需要其保持活动状态,请使用该实例。 在某些情况下,需要断开 shared_ptr 实例间的循环引用。 头文件:<memory>。 有关更多信息,请参见如何:创建和使用共享 weak_ptr 实例和weak_ptr 类。
http://www.cnblogs.com/Kai-Xing/p/4414239.html
C++中的动态内存管理是通过new和delete两个操作符来完成的。new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针。delete调用时,销毁对象,并释放对象所在的内存。但在程序中使用new和delete容易导致很多问题,这里列出三个比较容易犯的错误。
- 我们new了一个对象,但没有delete它。这会引起memory leak内存泄露,可能会导致程序崩溃。
- 用指针访问一个已经被free的对象。这就是我们常说的dangling pointer。
- delelte同一个内存区域两次。如果两个指针指向同一个内存区域,那我们delete一个指针后,再用另一个指针访问其指向的内存区域就会出现问题。
为了解决上面的问题,方便动态内存管理,c++提出了smart pointer的概念,在STL库中对应的实现主要有两种:shared_ptr、unique_ptr。下面我们主要介绍这两种smart pointer。
- shared_ptr:是一个模板类,定义在<memory>头文件里。shared_ptr对象会在其作用域结束时,自动销毁,如果该shared_ptr是指向某对象A的最后一个shared_ptr,那么A所在的内存会被释放。应用举例:shared_ptr<int> p(new int(4)); 或者用make_shared<T>()函数生成shared_ptr,shared_ptr<int> p = make_shared<int>(4)。
- unique_ptr:也是一个模板类,同样定义在<memory>头文件里。与shared_ptr不同的是,unique_ptr是自己”拥有“一个指向的对象,也就是说不同有两个或者以上的unique_ptr指向同一个对象。在一个unique_ptr对象的作用域结束时,unique_ptr指向的对象的内存被释放。为了保证unique_ptr对对象的独有性,赋值、复制操作是不允许的。但有一个例外,我们可以在函数中return一个unique_ptr。应用举例:unique_ptr<int> p(new int(4))。unique_ptr是c++11引入的,其之前对应的是auto_ptr,与unique_ptr不同的是,我们不能再函数中返回auto_ptr对象。
在程序中运用smart pointer还有一个优点,就是smart pointer保证其指向的动态内存被释放不论程序是否正常结束,而new和delete不能保证这一点。shared_ptr和unique_ptr在释放对象内存时默认用delete,不过我们可以指定自己的deleter,具体内容可参考C++ Primier Dynamic Memory部分。
应用举例:
1 #include <memory> 2 using namespace std; 3 4 int main(){ 5 shared_ptr<int> p(new int(4)); 6 shared_ptr<int> p2 = make_shared<int>(4); 7 cout << *p << " "; 8 unique_ptr<int> p3(new int(4)); 9 cout << *p3 << " "; 10 return 0; 11 }
shared_ptr 和 unique_ptr