You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:24:04