C ++函数使用引用作为参数错误

时间:2011-06-15 07:03:25

标签: c++

struct node {

  string info;
  node *next;

  node() {
   info = "string";
   next = NULL;

  }

};

void insert(node &anode) {
 node newNode;
 anode.next = &newNode;
}

此结构的insert实现有什么问题?我该怎么解决这个问题? 补充道:非常抱歉,我不清楚。我知道这个程序有什么问题。我想知道如何将新节点插入参考节点。由于我使用对节点的引用作为参数,这意味着该节点不能是指针?那么它存储在堆栈上?这意味着我不能从堆中使用内存? (或者是段错?)所以我想如何使用新的?这是我的主要困惑。也许我的方法是错的,但我不明白为什么它应该是。

7 个答案:

答案 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_ptrstd::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时按需创建节点来伪封装。然后,您可以使用头指针运行节点,并在完成列表后删除它们。