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

时间:2014-08-01 11:07:42

标签: c++ list function object return

所以我做了这个排序的双链表代码。我应该超载一些运营商。但是,当我尝试在其中一个函数中创建一个新的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会在返回之前自行销毁,然后在程序的最后,它会再次尝试销毁自己(什么?)但是由于它已经被释放,它将无法破坏它并且然后会弹出一个错误。

2 个答案:

答案 0 :(得分:1)

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

当你这样做时

myList = myList + myList2;

编译器会将其翻译为

myList.operator=(myList + myList2);

您可能还想了解the rule of three

答案 1 :(得分:0)

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

二进制算术运算符

上查看https://stackoverflow.com/a/4421719/3819284

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