c++分段错误:将字符串传递给链表中的节点

C++ Segmentation Fault: Passing a string to a node in a linked list

本文关键字:链表 节点 错误 分段 字符串 c++      更新时间:2023-10-16

我刚开始使用类模板,我只是试图在与链表相关的类中定义一个临时节点'temp',它将节点存储的字符串设置为通过用户输入在函数TowerHanoi::set_Discs(size_t disc)中创建的一些临时字符串。当我调用函数temp->set_data(tmp_str)时,我得到一个分段错误。我试着自己打电话给temp->set_data("hello");,我仍然得到错误。我不确定这里发生了什么,我试着研究了一下,但无济于事。我可能错过了一些明显的东西,但我现在完全迷路了。如果你需要更多代码,请告诉我。谢谢。

TowerHanoi.cpp:

#include "TowerHanoi.h"
#include <iostream>
#include <cstdlib>
using namespace std;
using oreilly_A2::node;
namespace oreilly_A2 {
    TowerHanoi::TowerHanoi() {
        for (int i=0;i<2;i++) {
            rod[i] = LStack<node<std::string> >();
        }
    }
    TowerHanoi::TowerHanoi(size_t numDiscs) {
        for (int i=0; i < 2; i++) {
            rod[i] = LStack<node<string> >();
        }
        discs = numDiscs;
    }
    void TowerHanoi::set_Discs(size_t disc) {
        node<string>* temp=NULL;
        while (disc != 0) {
            string tmp_str;
            for (size_t i=0; i<disc; i++) {
                tmp_str.append("x");
            }
            disc--;
        temp->set_data(tmp_str);
        rod[0].push(temp);
    }
    void TowerHanoi::print_Game() {
        for (size_t s=1; s<discs; s++) {
                cout << "   "; 
                    for (size_t o=1; o<discs-s;o++) {
                        cout << " ";
                    }
                //cout << tmp_node->data() << endl;
                    cout << "x" << endl;
            }
    }
}

node.h文件:

#ifndef NODE_CAMERON_H
#define NODE_CAMERON_H
#include <string>
namespace oreilly_A2 {
    template <typename Item>
        class node {
        public:
        node(); //constructor for node
        node(const Item val, node* newNext); //constructor with parameters
        ~node(); //destructor
        void set_data(Item new_data); //set the word that this node contains
        void set_link(node* new_link); //set the 'next' node
        void set_previous(node* new_prev);
        Item data() const; //return this node's word
        const node* link() const; //return next
        const node* back() const;
        node* link(); //return next
        node* back(); 
        private:
        node* next; //the next node
        node* previous;
        Item word; //the word this node contains
        };
}
#include "Node.template"
#endif

节点。模板文件:

    namespace oreilly_A2 {

    template <typename Item>
    node<Item>::node() {
        next=NULL;
        previous=NULL;
    }
    //Node.template
    template <typename Item>
    node<Item>::node(const Item val, node* newNext=NULL) {
        word = val;
        next = newNext;
    }
    template <typename Item>
    node<Item>::~node() {
        delete next;
        delete previous;
        delete word;
    }
    template <typename Item>
    void node<Item>::set_data(Item new_data){
            word = new_data;
    }

    template <typename Item>
    void node<Item>::set_link(node* new_link){
            next = new_link;
    }

    template <typename Item>
    void node<Item>::set_previous(node* new_back) {
            previous = new_back;
    }

    template <typename Item>
    Item node<Item>::data() const {  //return the word
            return word;
    }

    template <typename Item>
    const node<Item>* node<Item>::link() const { //return next node (const function)
            return next;
    }

    template <typename Item>
    const node<Item>* node<Item>::back() const { //return previous node (const)
            return previous;
    }

    template <typename Item>
    node<Item>* node<Item>::link() {
            return next; //return next node (non-const)
    }

    template <typename Item>
    node<Item>* node<Item>::back() { //return previous node (const)
            return previous;
    }
}

除非我错过了一些temp变量在调用set_data时是NULL。和任何普通对象一样,你需要先初始化它。

node<string>* temp=new node<string>();

然后在适当的时候释放它,以避免内存泄漏。

这不是temp_str的情况,因为后者不是指针,它是一个值,所以它被自动初始化(当它超出作用域时也会自动释放)。

已初始化temp as NULL。所以当你试图做temp->set_data(tmp_str);时,你实际上是在试图访问NULL指针。

您需要做的就是初始化temp。我更正了

下面的代码
 void TowerHanoi::set_Discs(size_t disc) {
            node<string>* temp=new node<string>();
            while (disc != 0) {
                string tmp_str;
                for (size_t i=0; i<disc; i++) {
                    tmp_str.append("x");
                }
                disc--;
            temp->set_data(tmp_str);
            rod[0].push(temp);
        }

为避免内存泄漏,您需要在完成后删除分配的所有内存。