关于const类型unique_ptr转换成非const

  • Post author:
  • Post category:其他


工作上遇到个问题,一个函数想传入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的时候,就可以用上述方法转化了)



版权声明:本文为cly141220010原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。