我想知道如何编写运算符=
,以便释放变量上现有的已分配内存。
例如,在下面的代码中,当重新分配x
指针x = new ClassExample(4)
时,旧的x->a
内存将被释放。
显然,使用new
时,运算符=
不适用(仅适用于已存在的值)。
有没有这样做的方法(分配新内存时可以使用旧内存)?
#include <iostream>
#include <cstdlib>
class ClassExample {
public:
int* a;
ClassExample& operator= (const ClassExample& rightSide) {
//.....
}
ClassExample(int val) {
a = new int(val);
}
};
int main()
{
ClassExample* x = new ClassExample(2);
x = new ClassExample(4);
return 0;
}
答案 0 :(得分:2)
永远不要违反此规则:每个new
必须与delete
平衡。
您可以使用智能指针来实现您想要的功能,或者在特定情况下使用更简单的功能:
简而言之,您为数据类型T构建了一个WrappedPtr<T>
模板类,该类包含T*
指针。作为起点,您可以定义一个赋值运算符,它将删除当前包装的对象,然后再将新对象作为其成员数据。你需要注意复制结构;甚至禁止它。
真正的智能指针也会以某种方式实现引用计数。
请参阅http://www.boost.org/doc/libs/1_54_0/libs/smart_ptr/shared_ptr.htm
答案 1 :(得分:0)
operator =表示您正在更改当前对象内的值。 在这里,您只是更改指针x。
你能做到的方法是:
ClassExample x(2);
x = ClassExample(4);
或者,在您的情况下,例如:
ClassExample* x = new ClassExample(2);
*x = *(new ClassExample(4));
最后一个会在你的程序中引入泄漏,所以不要使用它。 当然,您可以使用介于两者之间的东西,例如:
ClassExample* x = new ClassExample(2);
*x = ClassExample(4);
这个不会泄漏。