Kan*_*Yoo 1 c++ memory memory-leaks overloading operator-keyword
以下是可用于+操作的类的示例.
class A
{
public:
int *array;
A()
{
array = new int[10];
}
~A()
{
delete[] array;
}
A operator+ (const A &b)
{
A c;
for(int i=0; i<10; i++)
c.array[i] += array[i] + b.array[i];
return c;
}
};
int main()
{
A a,b,c,d;
/* puts some random numbers into the arrays of b,c and d */
a = b+c+d;
}
Run Code Online (Sandbox Code Playgroud)
a在复制结果之前是否会运行析构函数b+c+d?如果没有,我如何确保没有内存泄露?
该+运算符重载设计这种方式使得没有操作数被修改.
您需要向A添加一个等于运算符.此外,您可能还想创建一个复制构造函数.
当a变为从b + c + d返回时,array指针a将被覆盖而delete[]不会被调用.你需要创建一个删除操作符= array.
运算符=的示例如下:
A& operator=(A const& a)
{
if (&a != this) {
int* tmp = this->array;
this->array = new int[10];
//copy a.array to this->array
delete[] tmp;
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
如果你是新手,这里有很多细微之处operator=.
特别是,检查是否a相等this是必要的,因为写入是完全有效的:
A a;
a = a;
Run Code Online (Sandbox Code Playgroud)
这会导致无意义的复制,并且在大多数情况下operator=会导致错误.
另一个微妙的要求不是一个或多个编码风格(虽然是一个非常广泛的标准).复制动态分配的内容时,您总是希望在发布之前进行分配和复制.这样,如果new抛出异常(或其他东西失败),该对象仍然处于稳定状态,尽管它的旧数据而不是新的预期日期.