智能指针

对于普通指针,需要使用new分配新的内存空间,同时注意使用delete释放不再需要的资源。然而很多情况下delete指令没有得到正常执行。

C++11引入了智能指针。智能指针可以保存动态分配的资源,当堆栈变量离开作用域或被重置时,会自动释放所占用的资源。智能指针分为unique_ptrshared_ptrunique_ptr是具有唯一所有权语义的智能指针,而shared_ptr可以实现引用计数,每次复制该智能指针时,都会创建一个指向同一资源的新实例,将引用计数加1,而当智能指针实例离开作用域或被重置时,引用计数减1,当引用计数为0时,释放资源。智能指针定义在头文件<memory>中。

unique_ptr

如果在某个函数中使用new分配一个对象,而在delete之前抛出异常,则会导致内存泄漏。因此,需要使用智能指针。

创建智能指针一般使用

1
auto IntPtr = make_unique<int>(42);

与一般指针一样,智能指针也可以使用*->进行解引用。

使用get()将会返回底层指针,如函数

1
void process(*Simple simple){/** Do something **/}

可以使用如下方法进行调用

1
2
auto SimplePtr = make_unique<Simple>();
process(SimplePtr.get());

reset()方法可以将智能指针的底层指针改为另一个指针

1
2
SimplePtr.reset();	// 释放资源并指向nullptr
SimplePtr.reset(new Simple()); // 释放资源并指向一个新的Simple实例

release()方法可以断开智能指针与底层指针的连接并返回底层指针,并将智能指针设为nullptr

1
2
3
4
Simple* simple = SimplePtr.release();
// 使用simple指针
delete simple;
simple = nullptr;

shared_ptr

unique_ptr类似,可以调用make_shared()创建shared_ptr

1
auto SimplePtr = make_shared<Simple>();

注意不能创建多个指向同一对象的shared_ptr

1
2
3
Simple* mySimple = new Simple();
shared_ptr<Simple> Ptr1(mySimple);
shared_ptr<Simple> Ptr2(mySimple); // 会导致双重删除问题,Simple对象的构造函数会调用一次,而析构函数会调用两次

正确的操作是建立副本

1
2
auto Ptr1 = make_shared<Simple>();
shared_ptr<Simple> Ptr2(Ptr1); // 使用复制构造函数