Smart Pointer 启示录
爲什麽要使用智能指針?
C++ 11 带来了几个比较重要且实用的新特性,smart pointers 就是其中一员。auto_ptr
被摒弃,取而代之的是 unique_ptr
。不过它们两个都不是本文关注的对象,而是 shared_ptr
跟 weak_ptr
。使用智能指针的目的很纯粹,因为 C++ 没有 GC (Grabage Collector) 。所以我们需要一种 自动释放 资源 (包括但不限于用户空间的内存) 的机制,这个机制就是我们都熟悉的 RAII (Resource Acquisition is Initialization) 。顾名思义,RAII 的原理是对象初始化之期即资源获取之时。同样地,对象破坏之日乃资源归还之时。
NOTE:本文并不是智能指针的入门介绍,默认读者已经对智能指针有一定的认识。
智能指針的致命弱點
1. 重複刪除
智能指针的使用并不复杂,使用起来跟原始指针没太大区别,它们只是原始指针的 Wrapper Class (包装类) 。
原始指针的使用:
class A
{
};
int main()
{
A* aptr = new A; // 在heap上分配内存
delete aptr ; // 归还内存
return 0;
}
共享指针的使用:
#include <memory>
int main()
{
std::shared_ptr<A> asp1(new A); // 方法1
std::shared_ptr<A> asp2 = std::make_shared<A>(); // 方法2
A* a = new A();
std::shared_ptr<A> asp3(a); // 方法3
return 0;
}
以上三种构建共享指针方式都是合法的。我强烈反对以方法3的形式去构建共享指针,因为我认为这种行为非常危险。
事故现场1:
void shared(A* a)
{
std::shared_ptr<A> asp(a);
}
int main()
{
A* a = new A;
shared(a