C++动态内存管理之shared_ptr、unique_ptr

C++中的动态内存管理是经过new和delete两个操做符来完成的。new操做符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针。delete调用时,销毁对象,并释放对象所在的内存。但在程序中使用new和delete容易致使不少问题,这里列出三个比较容易犯的错误。c++

  1. 咱们new了一个对象,但没有delete它。这会引发memory leak内存泄露,可能会致使程序崩溃。
  2. 用指针访问一个已经被free的对象。这就是咱们常说的dangling pointer。
  3. delelte同一个内存区域两次。若是两个指针指向同一个内存区域,那咱们delete一个指针后,再用另外一个指针访问其指向的内存区域就会出现问题。

为了解决上面的问题,方便动态内存管理,c++提出了smart pointer的概念,在STL库中对应的实现主要有两种:shared_ptr、unique_ptr。下面咱们主要介绍这两种smart pointer。函数

  1. 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)。
  2. 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部分。指针

相关文章
相关标签/搜索