auto_ptr(C++11中摒弃)
unique_ptr(“独占”指向的对象)
shared_ptr(允许多个指针指向同一对象)
weak_ptr(伴随类,弱引用,指向shared_ptr所管理的对象)
有关智能指针的注意事项
ownership,所有权
- 对于特定的对象,只能有一个智能指针拥有它,避免多次删除同一个对象
- 通过 赋值操作 或 复制构造函数 转让所有权
- unique_ptr 比 auto_ptr 具有更加严格的ownership策略(下文详述)
reference counting,引用计数
- 初始化计数为0
- 每次赋值操作 或 复制构造,计数加1;每次过期,计数减1
- 仅当最后一个指针过期时(此时计数为0),才调用delete
- shared_ptr采用此策略进行对象共享,避免重复删除
auto_ptr
- auto_ptr的ownership策略
auto_ptr<string> p1(new string("auto"));
auto_ptr<string> p2;
p2 = p1; // p1 lose ownership
cout << p1; // 系统报错,p1不再指向有效数据
unique_ptr
- 编译阶段进行ownership检查(更加安全)