0
现摘录一篇不错的讲Shared_ptr的文章,要点记录如下:
- 智能指针是为了管理针对于异常、线程间等的内存,防止发生内存泄漏而存在的
- 其基于引用计数来管理内存,每新增一个指向该对象的智能指针则引用计数加一,减少一个(如超过作用域等)则减少一个。当减少到零时会自动调用相应对象的析构函数释放内存。
- 注意避免循环引用**,shared_ptr的一个最大的陷阱是循环引用,循环,循环引用会导致堆内存无法正确释放,导致内存泄漏。
1 异常安全
C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏。于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略。
使用 raw pointer 管理动态内存时,经常会遇到这样的问题:
- 忘记
delete
内存,造成内存泄露。 - 出现异常时,不会执行
delete
,造成内存泄露。
下面的代码解释了,当一个操作发生异常时,会导致delete
不会被执行:
void func()
{
auto ptr = new Widget;
// 执行一个会抛出异常的操作
func_throw_exception();
delete ptr;
}
在C++98中,为了写出异常安全的代码,代码经常写的很笨拙,如下:
vo