C++ 反转链表时析构函数中的内存错误
我正在写我自己的链表课程(出于教育目的),这里是:C++ 反转链表时析构函数中的内存错误,c++,pointers,memory,C++,Pointers,Memory,我正在写我自己的链表课程(出于教育目的),这里是: int main() { LinkedList L; L.add(4); L.add(3); L.add(2); L.add(1); L.print(); LinkedList L2 (reverseList(L.head())); cout << PRINT(L2.size()) << endl; L2.print(); retur
int main() {
LinkedList L;
L.add(4);
L.add(3);
L.add(2);
L.add(1);
L.print();
LinkedList L2 (reverseList(L.head()));
cout << PRINT(L2.size()) << endl;
L2.print();
return 0;
}
节点
#define PRINT(x) #x << " = " << x << " "
struct ListNode {
int val;
ListNode *next = nullptr;
ListNode(int x) : val(x), next(nullptr) {}
};
问题在于:LeetCode不需要我的main()
函数,因此出于测试目的,我显然使用了自己的函数。这是:
int main() {
LinkedList L;
L.add(4);
L.add(3);
L.add(2);
L.add(1);
L.print();
LinkedList L2 (reverseList(L.head()));
cout << PRINT(L2.size()) << endl;
L2.print();
return 0;
}
intmain(){
链接列表L;
L.加入(4);
L.加入(3);
L.加入第(2)款;
L.加入第(1)款;
L.打印();
链接列表L2(反向列表(L.head());
cout这与我在评论中说的不完全一样,但这本书仍然是一本不错的读物
这个问题有点不同:构造函数
LinkedList(ListNode* _h)
只需拥有\u h
。当您使用此构造函数初始化链接列表时,如中所示
LinkedList L2 (reverseList(L.head()));
head
在L1
和L2
中是相同的。当这两个列表超出范围时,它们都会尝试删除相同的节点(这只在原因上起作用一次)。这与我在评论中所说的不太一样,但这仍然是一个很好的解读
这个问题有点不同:构造函数
LinkedList(ListNode* _h)
只需拥有\u h
。当您使用此构造函数初始化链接列表时,如中所示
LinkedList L2 (reverseList(L.head()));
head
在L1
和L2
中是相同的。当这两个列表超出范围时,两个列表都将尝试删除相同的节点(仅在原因中起作用一次).我看到指针成员,但没有复制或移动构造函数。胡乱猜测:您违反了。正如@churill所说,L
和L2
具有相同的节点,它们都将删除其析构函数中的节点。我看到指针成员,但没有复制或移动构造函数。胡乱猜测:您违反了。正如@churill所说,L
和L2代码>具有相同的节点,两者都将删除其析构函数中的节点。因此,我必须编写一个副本构造函数,创建列表的副本,并将副本的头节点传递给函数以避免该错误,这对吗?@alekscooper是的,正确。此副本构造函数必须复制链接列表的每个元素。@alekscooper只是复制而已std::list的接口
那么我必须编写一个复制构造函数,创建列表的副本,并将副本的头节点传递给函数以避免该错误,对吗?@alekscooper是的,正确。该复制构造函数必须复制链表的每个元素。@alekscooper只需复制std::list的接口即可代码>