列表的节点在使用前被释放
Nodes of a list being freed before usage
我有一个包含节点的一维模板列表,每个节点都有一个到下一个节点的链接。它本身运行得很好,但当它包含另一个链表时就不行了。
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()
时将每个对象(而不是引用)的副本存储在列表中。
相关文章:
- 反向给定链表中的K节点
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 释放错误后堆使用
- G锁定铸造到基础上会释放模拟行为
- Boost Graph Library,修复节点大小
- 在将变量声明为引用时,堆在释放后使用
- C++A*算法并不总是在路径中具有目标节点
- 如何找到2个单链表的公共节点
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 计算每个节点的树高,帮助我解释这个代码解决方案
- 为什么我的删除节点函数实际上没有删除节点?
- 当我通过删除临时节点来释放内存时,我会得到读取访问违规行为.但是只有当我返回错误语句时
- 如何在列表中间释放删除的节点,而没有阀门错误
- 如何从链表上的节点为分配的类释放内存
- 释放链表节点时出现分段错误
- 从双链接列表中删除节点并释放其空间
- 列表的节点在使用前被释放
- “算子删除”如何为链表节点释放内存块
- C++:删除链接列表中的节点后释放它,如何
- 删除链表中的节点后释放分配的空间