C++ 访问unique_ptr中的结构字段会导致访问冲突
我有一门课是这样的:C++ 访问unique_ptr中的结构字段会导致访问冲突,c++,C++,我有一门课是这样的: template <typename T> class Store { private: struct pointNode { T data; std::unique_ptr<pointNode> next; }; std::unique_ptr<pointNode> head; public: Store() : head(nullptr) {} Store(c
template <typename T>
class Store {
private:
struct pointNode {
T data;
std::unique_ptr<pointNode> next;
};
std::unique_ptr<pointNode> head;
public:
Store() : head(nullptr) {}
Store(const T& data);
};
尝试创建一个构造函数,它是T数据的一个示例
template <typename T>
Store<T>::Store(const T& data) {
head->data = data;
}
但我无法访问head->数据和head->下一步。我不知道出了什么问题,我只是在学习使用unique_ptr,所以我可能不明白一些事情。我将感谢您的帮助。
导致错误的代码
引发异常:写入访问冲突
Store<int> a(5);
Storeconst T&constructor没有创建要由头成员的std::unique_ptr持有的pointNode对象。默认的std::unique_ptr构造函数将head设置为nullptr,因此它从不指向实际对象。因此,访问head->data是未定义的行为
使用如下方法构造头部:
Store=delete;//或者,如果需要,可以使用默认值
Storeconst T&data:headstd::使_唯一{
头部->数据=数据;
}
你说我不能访问head->数据是什么意思?你发现编译器错误了吗?你的程序崩溃了吗?这还不清楚。存储和堆栈之间的关系是什么?您是如何实例化这些模板的?@bччbаbаbаbаbаbаbаbаbаbаaаb听起来像是。您在编译时是否真的遇到错误?@БччСааа请您的问题包括产生此编译器错误的代码。在您展示给我们的代码中,您需要发布一个我们可以复制粘贴到编译器中并看到错误的消息。实际上,一个愚蠢的错误,感谢一个更好的方法,给pointNode一个以T作为输入的构造函数,然后您可以这样做:struct pointNode{T data;std::unique_ptr next;pointNodeconst T&data:datadata{}。。。Storeconst T&data:headstd::make_uniquedata{}这样,head->data一次构造和初始化,而不是默认构造,然后分别复制指定。@RemyLebeau您的编辑改进了文本,但我不明白您为什么删除Store::Store中head的初始化。这似乎是OP所描述的问题的根源。事实上,我认为复制构造函数应该只调用默认构造函数。@bitmask unique\u ptr有一个默认构造函数,它将初始化指向nullptr的指针,如果没有显式调用构造函数,该构造函数将自动被调用,因此调用headnullptr是多余的。存储=默认值;将为您生成等效于Store:head{}的代码。OP的问题不在于如何将nullptr分配给head,而是将nullptr分配给head。不,当调用unique\u ptr的move构造函数更有效时,Store的copy构造函数不应该调用unique\u ptr的默认构造函数。@RemyLebeau-Uhm,我的观点是,在我最初的帖子中,在您编辑之前,我专门将OP的代码从Store:headnullptr{}更改为Store:headstd::make\u unique{}。默认存储意味着它再次被错误地初始化为null ptr,而这正是OP的问题所在。