我创建了一个乘法运算符重载。它的声明如下:
T operator*(const T & right);
它创建一个本地 T 对象,计算其值并返回它。问题是,当它返回时,它似乎超出范围并且正在调用它的析构函数。 AFAIK它不应该发生,因为return语句应该创建一个副本。我没有提到它;该对象包含动态分配的内存,但它应该由我创建的赋值运算符处理。所以我有这样一句话:
t1 = t2 * t3;
其中 t1 , t2 和 t3 是 T 对象。
我已经使用了我的调试器,operator*
内的本地临时 T 对象很好,但返回的对象缺少动态分配的内容。
我想到的是return语句没有正确复制我的对象,因为它没有复制动态分配的内容,因为缺少复制构造函数。所以我做了一个这样的复制构造函数:
T(const T & arg)
{
*this = arg;
}
所以它会使用我的赋值运算符。事情开始变得怪异的时候。每次调用复制构造函数时,我都会得到堆栈溢出(差不多)。在调试时,似乎它甚至没有调用赋值运算符。可能有什么不对?
答案 0 :(得分:0)
好的,谢谢你的回复。 规则3/5 是个问题。我还有一种数据分配方法,在清理之前没有检查先前是否分配了数据。 已解决:)