struct node {
string info;
node *next;
node() {
info = "string";
next = NULL;
}
};
void insert(node &anode) {
node newNode;
anode.next = &newNode;
}
此结构的insert实现有什么问题?我该怎么解决这个问题? 补充道:非常抱歉,我不清楚。我知道这个程序有什么问题。我想知道如何将新节点插入参考节点。由于我使用对节点的引用作为参数,这意味着该节点不能是指针?那么它存储在堆栈上?这意味着我不能从堆中使用内存? (或者是段错?)所以我想如何使用新的?这是我的主要困惑。也许我的方法是错的,但我不明白为什么它应该是。
答案 0 :(得分:5)
newNode
生活在insert
函数的范围内有什么问题。你可能想要像
void insert(node &anode) {
node* newNode = new node;
anode.next = newNode;
}
但父节点或其他东西必须处理新节点的生命周期。它现在拥有next
节点。如果您希望呼叫者负责,那么这可能更合适:
void insert(node& parentNode, node& nextNode) {
parentNode.next = &nextNode;
}
请注意,如果您有权访问C ++ 0x,则可以使用boost::shared_ptr或std::shared_ptr
来避免一些生命周期问题。这些智能指针基本上包装指针,并在没有人使用它时小心删除它。代码看起来像这样:
struct node {
// other data members...
shared_ptr<node> next;
// constructors/destructors
};
void insert(node& anode) {
anode.next = shared_ptr<node>(new node);
}
现在您不必担心在任何时候删除新节点。
答案 1 :(得分:2)
您将(隐式地,作为anode
的成员)返回指向局部变量newNode
的指针。当您离开newNode
时,insert
会被销毁,因此anode.next
之后会包含无效指针。
答案 2 :(得分:1)
“什么是错的”与引用无关。
此实现在anode.next
中存储指向局部变量的指针。之后立即销毁局部变量(当insert
函数存在时),而指针继续指向被破坏的位置。
答案 3 :(得分:1)
问题是,一旦函数newNode
存在,局部变量insert
将超出范围,anode.next
现在将引用无效节点。
答案 4 :(得分:1)
您使用的是静态地址。
void insert(node &anode) {
node newNode;
anode.next = &newNode;
}
newNode是一个本地对象。在函数结束时,它将超出范围,其地址将无效。
答案 5 :(得分:1)
假设您正在谈论运行时错误。问题在于insert
函数
node newNode
只是一个局部变量,当你在迭代节点时尝试访问它时会引起问题。
在插入函数中你应该做这样的事情:
node* newNode = new node();
anode.next = newNode;
答案 6 :(得分:1)
如果你坚持使用免费功能,最好的选择可能是:
static node* head = NULL;
static node* current = NULL;
void insert(std::string& val)
{
if (!head) {
current = new node(val);
head = current;
} else {
current->next = new node(val);
current = current->next;
}
}
让你的构造函数接受一个std :: string作为参数。依靠函数外部的实体为您创建节点可能不是最好的主意。您可以通过在调用insert时按需创建节点来伪封装。然后,您可以使用头指针运行节点,并在完成列表后删除它们。