shared_ptr传入unique_ptr后引用计数与指针异常问题求助
问题原因分析:悬垂引用导致的非法值
这和unique_ptr没有任何关系,核心问题是误用了引用类型,导致出现悬垂引用。
原代码的问题拆解
- 构造函数的形参
const sp xx是一个临时拷贝对象:当你在main中传入p时,会触发shared_ptr的拷贝构造,生成形参xx。这个xx的生命周期只限于bar的构造函数执行期间,构造函数结束后,xx会被立即销毁。 - 类成员
const sp& x是一个引用,你在初始化列表中把它绑定到了这个临时的xx上。当构造函数执行完毕,xx被销毁,x就变成了悬垂引用——它指向的内存已经被释放,里面的内容都是无效的垃圾值。 - 构造函数内的打印是正常的:因为此时
xx还没销毁,x引用的是一个有效的shared_ptr;但调用test()时,xx早已不存在,所以打印出的use_count和指针地址都是非法的内存值。
修改后正常的原因
把const sp& x;改为const sp x;后,x不再是引用,而是一个独立的shared_ptr对象:
- 初始化时会拷贝形参
xx,此时main里的p、构造函数的xx、bar的x三者都持有对同一个int对象的引用,所以构造函数内的use_count是3。 - 构造函数结束后
xx销毁,剩下p和x两个引用,所以test()里的use_count是2,指针地址也始终有效,因为x是一个合法的shared_ptr,生命周期和bar对象一致。
验证:和unique_ptr无关
哪怕你不用unique_ptr,直接在main里写:
bar b(p); b.test();
结果和原代码的错误情况完全一样——这说明问题根源和unique_ptr的工作机制毫无关系,只和引用的生命周期绑定有关。
内容的提问来源于stack exchange,提问作者Xiaofa Piao
相关产品推荐
相关产品推荐

