c++标准库(笔记):智能指针(1) -- shared_ptr

本文介绍了C++11引入的智能指针shared_ptr的使用,包括通过new创建、make_shared构造、reset赋值、自定义Deleter以及注意事项如不能直接使用赋值符、无法进行指针运算等。此外,还提到了shared_ptr在处理数组时的特殊处理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自c++11起,c++标准库提供了两大类型的智能指针
1、shared_ptr
2、unique_ptr
这两个类被定义在<memory>内

shared_ptr:当对象再也不被使用时就被清理
创建shared_ptr:
shared_ptr<string> pNico(new string("nico"));
也可以使用make_shared:
shared_ptr<string> pJutta = make_shared<string>("jutta");
还可以先声明再赋值,但不能使用赋值运算符,必须改用reset:
shared_ptr<string> pNico;
pNico.reset(new string("nico"));

shared_ptr可以声明属于自己的Deleter:
shared_ptr<string> pNico(new string("nico"), [](string* p){cout << "delete" << *p
<< endl; delete p;}
pNico = nullptr;
如果在最后一个对象结束后,而清理工作不仅仅是删除内存,则必须明确自己给出的deleter,可
以指定属于自己的析构策略。

std::shared_ptr<std::ofstream> fp(new std::ofstream("tmpfile.txt"), FileDeleter
("tmpfile.txt"));
FileDeleter是一个函数,当最后一个对象要结束生命的时候,由他删除内存并删除tmpfile.txt
文件

注1:由于接受单一pointer作为唯一实参的构造函数是explicit,所以不能够使用赋值符,那样
的话会被视为需要一个隐式转换。然而新式初始化语法(列表初始化)是被接受的

shared_ptr<string> pNico = new string("nico"); //error
shared_ptr<string> pNico{new string("nico")};  //ok

注2:shared_ptr不提供operator[]以及指针运算,只提供operator*和operator->,因此,想访
问内存,必须使用get()获取被shared_ptr包裹的内部指针:

smp.get()[i];

注3:关于array的应用:
std::shared_ptr<int> p(new int[10]); //error,默认构造器提供的是delete而不是delete[]
可以通过自己定义一个deleter:
std::shared_ptr<int> p(new int[10],[](int* p){delete[]p;});
也可以使用为unique_ptr提供的辅助函数作为deleter:
std::shared_ptr<int> p(new int[10], std::default_delete<int[]>());

其他的应用:
调用use_count()查看shared pointer所指对象的当前拥有者数量;
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值