class LinkedList {
public:
LinkedList();
~LinkedList();
LinkedList& operator= (const LinkedList& other);
void insert(int val); // adds a node
private:
LinkedListNode* head;
};
使用默认赋值运算符
list_one.head = list_two.head;
我的理解是list_one和list_two现在共享list_two最初指向的结构元素。
当下面的析构函数运行时会发生什么,为什么程序会崩溃?
~list_two();
~list_one();
有人可以提供详细的直观的解释吗?谢谢!
答案 0 :(得分:1)
浅拷贝意味着您要复制位置而不是该位置的内容。
所以,你有两个指向同一位置的指针。当您使用析构函数在同一位置释放(释放)两次内存时,就会发生崩溃。
答案 1 :(得分:1)
int main()
{
int *p1 = new int; // assume p1 is member of list 1, so you allocate memory
int *p2 = p1; // assume p2 is a member of list 2 and you did assignment.
delete p1; // now destructor for p1 gets called, so must delete memory
delete p2; // now destructor for p2 gets called.
// also must delete dynamic memory. Umm, Trouble here.
}
假设您编写了一个析构函数,简而言之,如果两个对象的成员指向同一个动态分配的内存,那将会发生什么。
您将删除相同的地址两次(双删除错误),这样做是未定义的行为。更有可能发生崩溃。
答案 2 :(得分:0)
删除list_two
时,head
节点指针及其指向的任何节点都应该(或应该被删除)。但是这些节点没有被复制到list_one
,而是复制了head
指针值,这意味着它指向了与list_one
指向的节点相同的节点列表。因此,当删除list_one
时,程序会尝试删除当前存储在list_one.head
中的先前有效地址的先前有效对象。