gpt4 book ai didi

c++ - 为什么在范围末尾销毁临时对象后 C++ 程序崩溃

转载 作者:行者123 更新时间:2023-11-28 06:28:57 25 4
gpt4 key购买 nike

所以我有点困惑。在调用 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
}

最佳答案

如果我假设正确,LinkedList 的析构函数将销毁列表中的所有节点。我还假设复制构造函数制作了列表的浅表拷贝。 (如果你没有显式地实现复制构造函数,这是默认的。)当你运行代码时会发生这种情况:

void printList(Node*);
void changeList(LinkedList);

int main(){

LinkedList list; //first instance is created

for (int i = 0; i < 10; i++)
list.append(new Node(i+1, nullptr)); // nodes added to the first instance

changeList(list); // copy constructor called, second instance is
// created with the same set of node objects


printList(list.getHead()); // nodes does not exist any more because of
// the destructor called at the end of changeList


system("pause");
return 0;
}

void changeList(LinkedList list) // copy constructor called, second instance is created
list.append(new Node(45, nullptr)); // nodes added to the same chain of nodes
} // destructor is called, all the nodes are destroyed

void printList(Node* head){
Node* temp = head;
if (temp != nullptr){
cout << temp->value << endl;
printList(temp->next);
}//end if
}

您可以通过在 changeList 函数中接受一个引用参数来解决这个问题:

void changeList(LinkedList &list)  // no copy
list.append(new Node(45, nullptr));
} // no destructor is called

关于c++ - 为什么在范围末尾销毁临时对象后 C++ 程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27997060/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com