模板类变量在更改时出现段错误 [重复]

Template class variable giving segment fault when changing it [duplicate]

提问人:Ancient_Spirit 提问时间:11/9/2023 最后编辑:Ancient_Spirit 更新时间:11/9/2023 访问量:82

问:

我遇到的问题出在我的功能中。我正在尝试将变量设置为 ,传递到函数中的变量,但每次尝试时都会遇到分段错误。set_data()data_fieldd

这是调用类的函数

对于测试运行变量是我尝试添加到节点data_field的 int。 i 的 int 值为 。iii = 0

template<class T>
void dlist<T>::rear_insert(T i){

    dnode<T>* temp;

    temp -> set_data(i); // function call that is causing the segmentation fault

    if(tail == nullptr ){

        tail = temp;

        head = temp;

    } else {

        dnode<T>* temp1 = tail;
            
        tail -> set_next(temp);

        tail = tail -> next();

        tail -> set_previous(temp1);


    }

}

这是我用于给我错误的类的完整代码

template<class T>
class dnode{

    public:

        dnode(T d = T(), dnode *n = NULL, dnode *p = NULL) {data = d;  next = n; previous = p;}

        void set_data(T d){
            

            data_field = d; //The line that gives 
                            //segmentation fault
            
        }

        void set_next(dnode *n){next_field = n;}

        void set_previous(dnode *p){previous_field = p;}

        T data()const {return data_field;}

        dnode* next() const {return next_field;}

        dnode* previous() {return previous_field;}

    private:
        T data_field;
        dnode* next_field;
        dnode* previous_field;

};

我使用 cout 来检查它是否接收了正确的数据,并且它能够将正确的数据打印到文件中。问题出在 .我已经查看了其他来源,他们已经像我一样设置了代码,我不确定为什么我会遇到分段错误。data_field = d

 void set_data(T d){

            cout << d;

            //data_field = d; 
            
 }

它输出哪个是 D 的正确值。取消注释会导致分段错误。0data_field = d

C++ 模板 变量

评论

1赞 Darius 11/9/2023
请提供最小可重现的代码示例。如果没有更多上下文,我假设您正在调用 is .dnodednode->set_datanull
0赞 Ancient_Spirit 11/9/2023
@Darius 如何将模板变量初始化为默认值,使其不会被初始化?null
0赞 Darius 11/9/2023
在这种情况下,您需要初始化以指向有效内容。最简单的就是做.tempauto temp = new dnode<T>*();
0赞 Ancient_Spirit 11/9/2023
@Darius 感谢您的帮助,这让我的代码正常工作
0赞 Joel 11/9/2023
如果你打开你的编译器警告并听它们,你就会知道出了什么问题。请参阅 godbolt 链接。它清楚地说明了导致段错误的原因。当您修复此错误时,还有更多错误需要修复。

答:

0赞 Darius 11/9/2023 #1

在这种情况下,您需要初始化 temp 以指向有效内容。最简单的就是去做auto temp = new dnode<T>();

评论

1赞 Joel 11/9/2023
这不起作用,因为您正在从 .相反,你必须这样做。newauto temp = new dnode<T>();