Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 反转链表时析构函数中的内存错误_C++_Pointers_Memory - Fatal编程技术网

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的接口即可