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

C++ function using reference as param error

本文关键字:参数 错误 引用 函数 C++      更新时间:2023-10-16
struct node {
  string info;
  node *next;
  node() {
   info = "string";
   next = NULL;
  }
};
void insert(node &anode) {
 node newNode;
 anode.next = &newNode;
}

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

问题是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);
}

现在,您不必担心在任何时候删除新节点。

您正在返回(隐式地,作为anode的成员(一个指向局部变量newNode的指针。当您离开insert时,newNode会被销毁,因此anode.next之后会包含一个无效指针。

BTW:这个问题应该被标记为"家庭作业"吗?:(

"怎么了"与引用无关。

此实现在anode.next中存储一个指向局部变量的指针。局部变量随后立即被销毁(当insert函数存在时(,而指针继续指向被销毁的位置。

问题是,一旦函数insert存在,局部变量newNode将超出作用域,而anode.next现在将引用一个无效节点。

假设您谈论的是运行时错误。问题是在您的insert功能中

node newNode 

只是一个局部变量,当您稍后在节点上迭代时尝试访问它时,它将导致问题。

在插入函数中,您应该执行以下操作:

node* newNode = new node();
anode.next = newNode;

如果你坚持使用免费函数,你最好的选择可能是:

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::字符串作为参数。依靠函数之外的实体为您创建节点可能不是最好的主意。您可以通过在调用insert时按需创建节点来对其进行伪封装。然后,您可以使用头指针运行节点,并在完成列表后删除它们。

您使用的是静态地址。

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

newNode是一个本地对象。在函数结束时,它将超出作用域,并且其地址将无效。