C++函数使用引用作为参数错误
C++ function using reference as param error
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是一个本地对象。在函数结束时,它将超出作用域,并且其地址将无效。
- C++声明模板参数阴影模板参数错误
- 为什么 CRTP 模板C++给出无效参数错误?
- (C/C++)fscanf_s从txt文件以字符形式读取数组时缺少整数参数错误
- 参数错误可能与类型不匹配有关?
- printf 和 strftime 的参数错误无效
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 如何修复"没有重载函数需要 2 个参数"错误C++
- 术语不计算为函数采用 1 个参数错误?
- 从带有 getline() 的文件读入一行上有多个信息得到无效参数错误
- 为什么我不能像使用 std::string::size_type 那样使用 QList::size_type?(模板参数错误)
- cudaFreeHost() 无效参数错误
- 精神语法不会编译:函数模板参数错误?
- C 功能具有参考参数错误的迭代器错误.寻求解释
- 使用getDefaultCommConfig使用无效的参数错误
- C++ 可变参数模板和模板模板参数:错误:模板参数列表中参数 1 处的类型/值不匹配
- 使用SWIG生成的Python库时,向量分配器参数错误
- 错误C2664:无法转换参数错误
- C 作为参数错误的功能
- 命令行参数错误
- 增强Python参数错误