为什么在范围末尾销毁临时对象后 C++ 程序崩溃
Why does c++ program crash after temporary object is destroyed at end of scope
所以我有点困惑。在调用 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
所以我有点困惑。在调用 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