C++类包含unique_ptr数组时使用unique_ptr实例报错如何解决
问题原因
你的错误核心是空指针解引用:std::unique_ptr<B> b; 仅声明了一个空的独占智能指针,没有指向任何实际的B类实例,后续执行b->addV操作时访问了非法内存,触发段错误,操作系统返回的139错误码就是段错误的典型标识。
栈上声明B b;的写法会自动调用默认构造函数创建实例,所以可以正常运行。
修复方案
仅需要修改main函数中unique_ptr的初始化逻辑,创建实际的B实例即可:
int main() { // 修改这一行,用make_unique创建实际实例 std::unique_ptr<B> b = std::make_unique<B>(); b->addV(std::make_unique<W>(1)); b->addV(std::make_unique<W>(2)); b->write(std::cout); return 0; }
额外优化建议
你当前实现的A类拷贝赋值运算符存在逻辑缺陷:如果赋值的目标对象vv_中原本就有元素,原有内容不会被清空,会出现新旧元素混合的问题,且不满足异常安全要求,建议调整为如下实现:
A& operator=(A const& other) { if (this == &other) return *this; // 先构造临时对象,克隆成功后再替换原有内容,保证异常安全 std::vector<std::unique_ptr<V>> tmp; tmp.reserve(other.vv_.size()); for (const auto& v : other.vv_) { tmp.push_back(v->clone()); } vv_ = std::move(tmp); return *this; }
内容的提问来源于stack exchange,提问作者modkin
相关产品推荐
相关产品推荐

