关于const类型unique_ptr转换成非const

8 篇文章 0 订阅

工作上遇到个问题,一个函数想传入std::vector<std::unique_ptr<T>>类型的变量,只想读取数组中unique_ptr的各个裸指针并返回,并且后面这些智能指针也用不到了。

因为只想读取,所以参数想传一个const std::vector<std::unique_ptr<T>>& vec进去(这个想法我现在想来是错误的,原因在本文后面解释)。

传了const进去后就有个问题,我要取裸指针,只有两个方法,要么用get(),要么用release()。

由于get()只是取出裸指针地址,智能指针仍然存在,那么一旦该智能指针在某个地方被析构了,那我其他要用到这个裸指针的地方,也就变成悬垂指针了,访问到了错误数据。(我猜想多线程中可能会导致两个地方不在同一线程中被执行)那么用get()就有一定风险。

用release()也存在个问题,release会把智能指针的值释放并改变,与const冲突,编译过不了。

那我就只能想着先把取出的const std::unique_ptr<T>类型的指针变成非const类型的,再release()。直接用const_cast<std::unique_ptr<T>>会有用到拷贝构造的问题,但unique_ptr又没有拷贝构造函数。查了资料后发现可以按如下方式转化。

std::unique_ptr<T> myptr1 = std::move(const_cast<std::unique_ptr<T>& >(myptr));

const_cast的类型上多加个引用,并且用move来转移所有权给新智能指针,然后myptr1就能通过release()来取出裸指针了。

问题解决,现在来说下为什么不该传一个const std::vector<std::unique_ptr<T>>& vec进去。因为我后面是要用release的,那么本身既然对智能指针有修改了,那就没必要传const类型进来了,就应该是非const的。(当然,函数外层我本身有非const类型的该变量,如果拿不到非const类型的又必须要转化成非const的时候,就可以用上述方法转化了)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值