内存管理
智能指针
对于普通指针,需要使用new
分配新的内存空间,同时注意使用delete
释放不再需要的资源。然而很多情况下delete
指令没有得到正常执行。
C++11引入了智能指针。智能指针可以保存动态分配的资源,当堆栈变量离开作用域或被重置时,会自动释放所占用的资源。智能指针分为unique_ptr
与shared_ptr
。unique_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 | auto SimplePtr = make_unique<Simple>(); |
reset()
方法可以将智能指针的底层指针改为另一个指针
1 | SimplePtr.reset(); // 释放资源并指向nullptr |
release()
方法可以断开智能指针与底层指针的连接并返回底层指针,并将智能指针设为nullptr
1 | Simple* simple = SimplePtr.release(); |
shared_ptr
与unique_ptr
类似,可以调用make_shared()
创建shared_ptr
1 | auto SimplePtr = make_shared<Simple>(); |
注意不能创建多个指向同一对象的shared_ptr
1 | Simple* mySimple = new Simple(); |
正确的操作是建立副本
1 | auto Ptr1 = make_shared<Simple>(); |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Eternity's Blog!