对象在返回之前破坏自己?c++
Object destroys itself before returning? C++
所以我做了这个排序的双链表代码。我应该重载几个运算符。然而,当我试图在其中一个函数中创建一个新的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
的适当赋值运算符。
- 没有为自己的结构调用列表推回方法
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- C++从对象自己的类中删除对象
- 使用 std::optional,而不是自己的结构
- 子轴围绕父轴而不是他自己的轴旋转
- 有没有办法让类在C++中转换自己
- 这个C++编译器优化(在自身的实例上调用对象自己的构造函数)的名称是什么,它是如何工作的?
- C++ 如何为自己的迭代器类从迭代器转换为const_iterator?
- 重载 + 自己的类和 std::string 的运算符
- 类无法访问自己的私有静态 constexpr 方法 - Clang bug?
- 是否可以在不填充自己的参数的情况下将模板函数作为参数传递?
- 如何访问模板参数自己的模板参数?
- 将矩阵乘以我自己的输入的向量
- 您应该在什么时候创建自己的异常类型
- 派生类是从基类继承 v 指针并仅使用它,还是也有自己的 v 指针?
- string1 == string2 和你自己的 for 循环比较有什么区别?
- 如何正确包含我自己的标头?
- 自己的自定义向量类. 内存重新分配