在操作符*中解构返回值

Return value destructed in operator*

本文关键字:返回值 操作符      更新时间:2023-10-16

我正在创建一个乘法运算符重载。它是这样声明的:

T operator*(const T & right);

创建一个局部T对象,计算它的值并返回它。问题是,当它返回时,它似乎超出了作用域,并且它的析构函数正在被调用。我想这不应该发生,因为return语句应该创建一个副本。我没有提到它;对象包含动态分配的内存,但它应该由我做的赋值操作符处理。所以我有这样一行:

t1 = t2 * t3;

, t1 , t2 t3 T 对象。

我已经使用了我的调试器,operator*内部的本地临时T对象很好,但是返回的对象缺乏动态分配的内容。

我想到的是,return语句没有正确地复制我的对象,因为它没有复制动态分配的内容,因为缺乏复制构造函数。所以我创建了一个这样的复制构造函数:

T(const T & arg)
{
    *this = arg;
}

所以它会使用我的赋值操作符。就在那时,事情开始变得奇怪起来。每次调用复制构造函数时,我(几乎)都会得到堆栈溢出。在调试时,它似乎甚至没有调用赋值操作符。会出什么问题呢?

好的,谢谢你的回复。规则3/5是问题所在。此外,我有一个数据分配的方法,在清理之前,它不会检查是否有先前分配的数据。 :)