【发布时间】:2015-01-17 06:59:49
【问题描述】:
所以我有点困惑。在调用 changeList() 后尝试 printList() 时,这段代码将失败。但是,当我删除析构函数时,代码运行时不会崩溃。我的问题是,为什么?我知道在我在这里的代码中,我将对象按值传递给changeList,因此,一个临时对象被创建为参数的副本。对此临时对象所做的任何更改都不会影响我传入的原始对象。那么为什么程序会崩溃,就好像我正在访问一个被破坏的对象一样?不应该在 changeList 完成后销毁临时对象,然后 printList 应该只打印 1 到 10 而不是 1 到 45。
void printList(Node*);
void changeList(LinkedList);
int main(){
LinkedList list;
for (int i = 0; i < 10; i++)
list.append(new Node(i+1, nullptr));
changeList(list);
printList(list.getHead());
system("pause");
return 0;
}
void changeList(LinkedList list){
list.append(new Node(45, nullptr));
}
void printList(Node* head){
Node* temp = head;
if (temp != nullptr){
cout << temp->value << endl;
printList(temp->next);
}//end if
}
【问题讨论】:
-
Changelist 复制列表 - 我想这不是你想要的
-
调用外部程序“暂停”是没有意义的。使用 Ctrl-F5 从 Visual Studio 运行程序并保持控制台窗口打开。您的代码没有暴露问题,可能是您没有显示的类定义有问题。
-
你的析构代码在哪里?
-
这是一个疯狂的猜测。您还没有定义复制构造函数。因此,调用将参数传递给
changeList()的复制构造函数复制了列表头。当该临时节点被销毁时,它会销毁所有节点,因为它们是共享的。您没有意识到这一点,因为节点共享意味着append具有预期的结果。
标签: c++ pointers temporary-objects