c++ 有关未用对传参方式而出现的意外内存释放问题 20190710

创建了一个类,因为此类的对象常出现赋值的操作情况,所以重写了该类的赋值符号。类似于下方这样:

class test

{

int* a[10];

test& operator=(test t)

{

for(int i=0;i<10;i++)

{
this.a[i]=new int();
this.a[i]=t.a[i];

}

}
~test()
{
for(int i=0;i<10;i++)
{
delete this.a[i];
this.a[i]=NULL;
}
}

}

以上代码中,如果对两个类对象使用赋值符号,会将右值赋值给左值。例如 test c;test d; c=d;

则将d对象的值赋值给c对象。

但是在实际过程中出现了一个问题,就是d值赋值给c值后,d中的a指针数组中的指针全部被释放掉,不是原来的值了。也就是说在赋值过程中,右值被更改了。

原因就在于operator传参方式发生了错误。
test& operator=(test t) 这种方式,处理过程是将传参的实体拷贝在一个临时变量中,t所代表的内容,是临时变量,只在赋值函数中有效,函数结束,这块儿内存会被释放掉。释放的时候,会调用析构函数。而临时变量中存储的指针指向的却是原来的赋值实体的数值,所以一旦释放临时变量中的指针内容,原来的右值的指针所指向的内容被释放,导致右值更改。

解决方式是更改传参方式,利用引用传参。

如下:

test& operator=(test &t)。这样,函数取的是赋值实体的地址来进行赋值,操作的是右值本身,函数结束不会调用析构函数。

&传参方式是传递实体的地址,实际操作的就是参数实体。

你可能感兴趣的:(c++)