对象在返回之前破坏自己?c++

Object destroys itself before returning? C++

本文关键字:自己 c++ 返回 对象      更新时间:2023-10-16

所以我做了这个排序的双链表代码。我应该重载几个运算符。然而,当我试图在其中一个函数中创建一个新的SDL(排序的双重列表)时,它会在我设法将其返回给主函数之前自行销毁。我试着调试了很多次。我看到错误发生的地方,但我不知道如何解决它。下面是出错的代码。

SortedDoublyLinkedList SortedDoublyLinkedList::operator+(const SortedDoublyLinkedList &    otherList)
{
    SortedDoublyLinkedList myNewList(otherList);
    Node *currentNode = head;
    while (currentNode) {
        myNewList.add(currentNode->value);
        currentNode = currentNode->next;
    }
    return myNewList; // destroys itself
}

当编码器在主代码中编写"mylist = mylist + mylist2"来将两个列表相加时,上面的函数将重载。

下面是另一个:

SortedDoublyLinkedList SortedDoublyLinkedList::operator+(const int & myNumber)
{
    SortedDoublyLinkedList myNewList(*this);
    myNewList.add(myNumber);
    return myNewList;    // destroys itself
}

相同的协议。

测试用例如下:

myList += myList2;//工作正常!

myList += myList + 15;//工作正常!

SortedDoublyLinkedList myList3 = myList + 15;//创建一个新的列表,不修改myList,工作正常!

用户输入:

出错

myList = myList + myList2;

myList = myList + 15;

我不知道为什么会发生这种事。在上面的两个函数中,myNewList会在返回之前销毁自己,然后在程序的最后,它会尝试再一次销毁自己(什么?),但是因为它已经被释放了,销毁它会失败,然后弹出一个错误。

复制-赋值操作符只能赋值单个数字,不能复制整个列表。如果你想把一个列表赋值给另一个列表,你需要一个合适的复制赋值操作符来进行深度复制。

当你这样做

myList = myList + myList2;

编译器会将其翻译为

myList.operator=(myList + myList2);

你可能还想读一下"三"规则

二进制运算符+不应该这样写。

参见https://stackoverflow.com/a/4421719/3819284 二进制算术运算符

编辑:正如Joachim Pileborg所说,您的代码缺少SortedDoublyLinkedList的适当赋值运算符。