C++模板类Store构造时访问unique_ptr指向的结构体字段触发写访问违规
错误根因
你触发写访问违规的核心原因是:对未指向有效对象的unique_ptr执行了解引用操作。
- 作为智能指针,
std::unique_ptr本质只是裸指针的RAII包装,只负责管理指向内存的生命周期,本身不会自动申请内存、构造对象。默认状态下它内部存储的就是空地址,和普通裸指针行为完全一致。 - 类的不同构造函数逻辑完全独立,无参构造里对
head设空的初始化逻辑,不会自动应用到带参构造上。你的带参构造没有在初始化阶段给head分配合法的pointNode内存,此时head要么是空指针,要么是未初始化的随机值。 - 直接执行
head->data = data,等同于用空/野指针向无效内存地址写入数据,操作系统检测到违规访问就会抛出写访问异常。
正确实现方式
给head分配有效的pointNode实例后再写入数据即可,推荐用std::make_unique完成内存申请和对象构造,全程由unique_ptr自动管理内存回收,不存在泄漏风险:
template <typename T> Store<T>::Store(const T& data) // 在初始化列表中让head持有新分配的节点 : head(std::make_unique<pointNode>()) { head->data = data; head->next = nullptr; }
补充说明
std::make_unique是C++14起提供的标准工具,相比手动用new给unique_ptr赋值,能规避异常安全、内存泄漏的边角问题- 如果使用不支持
make_unique的老旧编译器,可以替换为显式构造unique_ptr的写法:: head(std::unique_ptr<pointNode>(new pointNode()))
内容的提问来源于stack exchange,提问作者Alpharius
相关产品推荐
相关产品推荐

