Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 访问unique_ptr中的结构字段会导致访问冲突_C++ - Fatal编程技术网

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的问题所在。