物体在返回之前会自行毁坏? C ++

问题描述 投票:0回答:2

所以我做了这个排序的双链表代码。我应该超载一些运营商。但是,当我尝试在其中一个函数中创建一个新的SDL(已排序的双列表)时,它会在我设法将其返回到main函数之前自行销毁。我尝试这么多次调试。我看到错误发生的地方,但我不知道如何解决它。这是代码,事情搞砸了。

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”以将2个列表一起添加时,上面的函数将会超载。

这是另一个:

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会在返回之前自行销毁,然后在程序的最后,它会再次尝试销毁自己(什么?)但是由于它已经解除分配,它将无法销毁它然后出现错误起来。

c++ list function object return
2个回答
1
投票

您有一个复制赋值运算符只能分配单个数字,而不是复制整个列表。如果要将列表分配给另一个列表,则需要一个正确的复制赋值运算符来执行深层复制。

当你这样做

myList = myList + myList2;

编译器会将其翻译为

myList.operator=(myList + myList2);

您可能还想了解the rule of three


0
投票

这不是您应该编写二元运算符+的方式。

请参阅二进制算术运算符中的https://stackoverflow.com/a/4421719/3819284

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

© www.soinside.com 2019 - 2024. All rights reserved.