cpp智能指针

Keywords: #cs #cpp

C++智能指针

内存管理

在介绍智能指针之前,需要先提一下C++的内存管理。一般情况下,我们分配的对象内存管理有两种,一种是栈,一种是堆。这两个的区别在于,使用栈这种方式的变量在离开了作用域之后,就会被删除,但是堆不会受这个限制。所以用堆这种方式的变量(用new生成的)需要使用delete来释放。

智能指针的作用

这里就会引发一个问题,就是开发人员并不一定会总是记得去delete那些堆变量,这就导致可能占用了许多内存空间。这里就可以使用智能指针,用这种智能指针去控制管理这些堆内存,当没有使用后,自动就释放掉。

#include <memory>
class Entity(
public:
  Entity(){
  std::cout<<"build entity!!!"} ;
  ~Entity(){
  std::cout<<"destry entity!!!";}
);

int main()
{
  { std::unique_ptr<Entity> entity(new Entity()) ; //or std::make_unique<Entity> }
}

比如上面那个式子,就会出现Entity()在离开作用域之后会被自动释放。

这里介绍几个常用的智能指针:

unique_ptr<typename T>; // 只能创建一个,无法复制,优先推荐
shared_ptr<typename T>; // 可以复制多个,每复制一个会多一个引用计数,当为以后释放内存
weak_ptr<typename T>; // 可以复制,但是复制后引用数不会增加,当shared_ptr引用数为0自动释放。