列表的节点在使用前被释放

Nodes of a list being freed before usage

本文关键字:释放 节点 列表      更新时间:2023-10-16

我有一个包含节点的一维模板列表,每个节点都有一个到下一个节点的链接。它本身运行得很好,但当它包含另一个链表时就不行了。

LinkedList和Node看起来像这样:

template <class T> 
class LinkedList 
{ 
    private:
        Node<T>* pPreHead; 
    public:
        LinkedList(void);
        ~LinkedList(void);
        Node<T>* getHead(void);
        int size();
        void addElementToEnd(T& value);
        void deleteNextNode(Node<T>* pNodeBefore);
}
template <class T>
class Node 
{
    private:
        T value;
        Node* next;
    public:
        Node();
        Node* getNext();
        Node* getValue();
        void setNext(Node* nextElem);
        void setValue(T elem);
};

现在,对于任务,我需要使用LinkedList>,它是通过循环填充的。它看起来像这样:

ifstream fl;
fl.open("test1.in", std::ifstream::in);
while (fl.good())
{
    string currentLine;
    getline(fl, currentLine);
    LinkedList<string> newDNA;
    //newDNA being filled here so I skipped code
    DNAStorage.addElementToEnd(newDNA);
    //Place 1
}
//Place 2

现在,如果我在"位置1"中插入一些测试输出代码,一切都很好,但当循环进入新的迭代时,newDNA变量被释放,DNAStorage内的指针也被释放(这就是问题中的LinkedList<LinkedList<string>>),当我试图在"位置2"中打印任何内容时,我会出现分段错误。

不幸的是,我不能使用任何其他数据结构,因为这是我需要做的任务。我的问题是,如何才能解决这个问题,这样它就不会过早地被释放?

编辑:这是我的AddElementToEnd(T& value):代码

template <class T>
void LinkedList<T>::addElementToEnd(T &value)
{
    Node<T> *newtail = new Node<T>;
    newtail.setNext(NULL);
    newtail.setValue(value);
    if(pPreHead == NULL)
    {
        pPreHead = newtail;
        return;
    }
    Node<T> *tail = pPreHead;
    while(tail.getNext() != NULL)
    {
        tail = tail.getNext();
    }
    tail.setNext(newtail);
}

问题是,存储对超出范围的对象的引用,在尝试访问它们时会导致未定义的行为。您的LinkedList<string> newDNA在while循环的每次迭代中都会被创建和销毁,但您传递了一个要存储在DNAStorage列表中的引用。

一种解决方案是在调用addElementToEnd()时将每个对象(而不是引用)的副本存储在列表中。