c++智能指针
- shared_ptr
- unique_ptr
- weak_ptr
- auto_ptr(被 C++11 弃用)
- Class shared_ptr 实现共享式拥有(shared ownership)概念。多个智能指针指向相同对象,该对象和其相关资源会在 “最后一个 reference 被销毁” 时被释放。为了在结构较复杂的情景中执行上述工作,标准库提供 weak_ptr、bad_weak_ptr 和 enable_shared_from_this 等辅助类。
- Class unique_ptr 实现独占式拥有(exclusive ownership)或严格拥有(strict ownership)概念,保证同一时间内只有一个智能指针可以指向该对象。你可以移交拥有权。它对于避免内存泄漏(resource leak)——如 new 后忘记 delete ——特别有用。
shared_ptr
共享式拥有,多个智能指针可以共享同一个对象,对象的最末一个拥有着有责任销毁对象,并清理与该对象相关的所有资源。
- 支持定制型删除器(custom deleter),可防范 Cross-DLL 问题(对象在动态链接库(DLL)中被 new 创建,却在另一个 DLL 内被 delete 销毁)、自动解除互斥锁
#include <iostream>
#include <memory>
using namespace std;
void Func1(shared_ptr<int> a)
{
cout << "Enter Func1" << endl;
cout << "Ref count: " << a.use_count() << endl;
cout << "Leave Func1" << endl;
}
shared_ptr<int> Func2(shared_ptr<int>& a)
{
cout << "Enter Func2" << endl;
cout << "Ref count: " << a.use_count() << endl;
cout << "Leave Func2" << endl;
return a;
}
int main()
{
//构造一个指向int类型对象的指针aObj1,引用计数+1
shared_ptr<int> aObj1(new int(10));
cout << "Ref count: " << aObj1.use_count() << endl;
{
//同aObj1,不过由于生存周期在括号内,所以aObj2会被销毁
shared_ptr<int> aObj2 = aObj1;
cout << "Ref count: " << aObj2.use_count() << endl;//引用计数-1
}
//在调用函数时,参数为shared_ptr类型,参数为传引用类型,智能指针引用计数不变
Func2(aObj1);
//在调用函数时,参数为shared_ptr类型,参数为传值类型,智能指针引用计数+1,但是离开作用域之后,引用计数-1
Func1(aObj1);
//赋值 智能指针引用计数+1
shared_ptr<int> aObj3 = Func2(aObj1);//引用计数+1
cout << "Ref count:" << aObj3.use_count() << endl;
return 0;
}
weak_ptr
weak_ptr 允许你共享但不拥有某对象,一旦最末一个拥有该对象的智能指针失去了所有权,任何 weak_ptr 都会自动成空(empty)。因此,在 default 和 copy 构造函数之外,weak_ptr 只提供 “接受一个 shared_ptr” 的构造函数。
- 可打破环状引用(cycles of references,两个其实已经没有被使用的对象彼此互指,使之看似还在 “被使用” 的状态)的问题
share_ptr与weak_ptr的区别与联系_蒲公英的记忆的博客-CSDN博客_share_ptr weak_ptr
#include <iostream>
#include <memory>
using namespace std;
void Check(weak_ptr<int> &wp)
{
shared_ptr<int> sp = wp.lock(); // 重新获得shared_ptr对象
if (sp != nullptr)
{
cout << "The value is " << *sp << endl;
}
else
{
cout << "Pointer is invalid." << endl;
}
}
int main()
{
shared_ptr<int> sp1(new int(10));
shared_ptr<int> sp2 = sp1;
weak_ptr<int> wp = sp1; // 指向sp1所指向的内存,但是不会增加引用计数的次数
cout << *sp1 << endl;
cout << *sp2 << endl;
Check(wp);
sp1.reset();//sp1清除,计数减一,但是sp2还有引用计数
cout << *sp2 << endl;
Check(wp);
sp2.reset();//清除sp2,计数减一,此时引用计数等于0;
Check(wp);
system("pause");
return 0;
}
unique_ptr
unique_ptr 是 C++11 才开始提供的类型,是一种在异常时可以帮助避免资源泄漏的智能指针。采用独占式拥有,意味着可以确保一个对象和其相应的资源同一时间只被一个 pointer 拥有。一旦拥有着被销毁或编程 empty,或开始拥有另一个对象,先前拥有的那个对象就会被销毁,其任何相应资源亦会被释放。
- unique_ptr 用于取代 auto_ptr
auto_ptr
被 c++11 弃用,原因是缺乏语言特性如 “针对构造和赋值” 的 std::move
语义,以及其他瑕疵。
auto_ptr 与 unique_ptr 比较
- auto_ptr 可以赋值拷贝,复制拷贝后所有权转移;unqiue_ptr 无拷贝赋值语义,但实现了
move
语义; - auto_ptr 对象不能管理数组(析构调用
delete
),unique_ptr 可以管理数组(析构调用delete[]
);