C++拷贝构造函数中shared/unique_ptr不指向同数据的疑问及相关问题
问题1解答
- 核心原因是你自定义的拷贝构造函数没有实现智能指针的浅拷贝逻辑,反而可能做了深拷贝:
- C++的默认拷贝构造函数是逐成员拷贝,对于
shared_ptr来说,拷贝操作会让新指针和原指针指向同一内存,同时引用计数加1;如果是unique_ptr,默认拷贝构造是被禁用的,你能编译通过说明smartUniq应该是shared_ptr或者做了特殊处理。 - 但如果你自己写了自定义拷贝构造函数,却手动为
smartUniq和smartShared创建了新的内存(比如用make_shared新建对象并拷贝值),而不是直接复制原对象的智能指针,那a1和a2的智能指针自然指向不同数据。
- C++的默认拷贝构造函数是逐成员拷贝,对于
- 删除自定义拷贝构造后,编译器生成的默认拷贝构造会自动逐成员拷贝智能指针,所以二者会指向同一数据。
问题2解答
这段代码是错误的,它的行为完全不符合拷贝赋值运算符的设计逻辑:
- 拷贝赋值运算符的核心是把源对象(src)的状态复制给当前对象(
this),正常逻辑应该是先清理当前对象自身的资源(比如遍历this->myList删除元素,避免内存泄漏),再复制src的元素。 - 但这段代码却遍历并删除源对象src的myList元素,这会直接破坏src的内部状态:src后续访问这些被
delete的元素时,会触发悬空指针访问,导致程序崩溃或未定义行为。 - 推测这段代码是开发者的笔误,原本应该操作的是
this->myList,而非src.myList。
内容的提问来源于stack exchange,提问作者Ghazi
相关产品推荐
相关产品推荐

