我有一个Linked list类的简单实现,它有指向我已经定义的Node对象的指针。
函数insertHead创建一个新节点并将其插入头部。 但是,每当我调用该函数时,构造函数似乎每次都返回一个指向同一对象的指针。 (我使用GDB检查过)
我在这里粘贴代码的片段。如果有什么东西出现,有人可以告诉我吗?
void LinkedList::insertHead(int val){
Node temp(val);
if(head == NULL){
head = tail = &temp;
} else {
temp.setNext(head);
head = &temp;
}
}
班级定义:
class LinkedList{
Node *head;
Node *tail;
...
class Node{
int val;
Node *next;
...
Node::Node(int x){
val = x;
next = NULL;
}
答案 0 :(得分:1)
您需要在堆上而不是堆栈上分配节点。 (我鼓励你阅读这两篇文章)。如果支持,请使用nullptr
代替NULL
(> c ++ 11)
void LinkedList::insertHead(int val){
Node* temp = new Node(val);
if(head == nullptr){
head = tail = temp;
} else {
temp->setNext(head);
head = temp;
}
}
这还需要您使用delete
正确清理节点以避免内存泄漏,这很可能需要在列表类中添加自定义析构函数,这些都是这样的:
LinkedList::~LinkedList() {
Node* node = head;
while(node != nullptr) {
Node* toDel = node;
node = node->next;
delete toDel;
}
}
答案 1 :(得分:1)
你 cant 指定automatic storage
变量的地址并将其用于正文,因为它已超出范围(undefined behaviour
)。您需要在heap
上为node
动态分配空间。
Node * temp = new Node(val);
if(head == NULL)
{
head = tail = temp;
} else {
temp.setNext(head);
head = temp;
}
在析构函数中释放所有节点。