通常,我们定义一个结构或类节点,每当我们必须向链表添加新链接时,我们通常会动态创建一个新节点,对吗?
像这样:
node* temp = new node(x);
如果我们想要在堆栈上创建新链接而不是堆,该怎么办? 这样做了吗?
node temp(x);
这是一个足够安全的做法吗?因为我看到人们一直在堆上创建一个节点而从不在堆栈本身上。
现在,当我们删除链接时,如果我们在堆栈上创建了列表,那么我们不必使用delete / free运算符/函数,对吧?我们需要做的就是调整链接指针。
我试图在这里实现的是否有任何缺陷?
答案 0 :(得分:0)
您需要注意的问题是链接。如果您的Node
看起来像
class Node
{
int data;
Node* next;
}
如果您制作两个节点:
Node a{5, nullptr};
Node b{5, &a};
如果由于某种原因a
b
超出了b
之前的范围(在上面的示例中它没有赢,但你可以想象一个案例),那么{{1}}就有了{{1}}悬空参考。
当在堆上声明节点时,您可以显式处理链接被插入,移除,创建和销毁的顺序。
答案 1 :(得分:0)
如果从函数返回但保留对分配为局部变量
的节点的引用,则会出现问题考虑这个(不好的例子):
#include <iostream>
class Node {
public:
int v;
Node* next;
};
void b(Node*node){
Node b{2,nullptr};
node->next=&b;
}
void a(void){
Node top{1,nullptr};
b(&top);
std::cout<<top.next->v<<std::endl;//<-- INVALID! Lifetime of b has ended.
}
int main(void){
a();
return 0;
}