《白话C++》第10章 STL和boost,Page97 shared_ptr管理数组

7. 管理数组

std::unique_ptr可以管理单一对象,也可以管理堆数组:

std::unique_ptr <int[]> a(new int[9]);
a[0] = 1;

std::unique_ptr这个本事,std::shared_ptr在C++ 17标准之后,可以完美支持,比如:

std::shared_ptr <int> a(new int[9]); //需17或更高标准

若采用不支持17新标的编译器,该代码也可以编译通过,但释放时采用的是delete,而非delete[ ]。如果你无法使用17新标,可以借助shared_ptr提供的第二个入参,以指定如何释放对象。既然数组需要“delete [ ]”,我们可以提供一个特定的释放动作:

void delete_array(int* p)
{
    delete[] p;
}

然后将它指定为shared_ptr的第二个参数:

std::shared_ptr <int> a(new int[9], &delete_array);

虽然解决了释放问题,但在17之前的标准中shared_ptr没有提供针对堆数组所需的“[ ]”操作,因此要访问指定下标的元素,不得不这么写:

//a[0]= 1; 不行,shared_ptr没有重载[]操作符
a.get()[0] = 1;//可以,但太丑

 用上C++ 17甚至更高标准的编译器,上述烦恼应该就不存在了。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值