0

我想知道如何编写运算符=以便释放变量上现有的分配内存。

例如,在下面的代码中,当重新分配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;
}
4

2 回答 2

2

永远不要打破这个规则:每个new都必须与一个平衡delete

您可以使用智能指针来实现您想要的,或者在您的特定情况下更简单:

简而言之,您为数据类型 T 构建了一个WrappedPtr<T>模板类,其中包含一个T*指针。作为起点,您可以定义一个赋值运算符,该运算符将删除当前包装的对象,然后将新对象作为其成员数据。您需要注意复制构造;甚至禁止它。

真正的智能指针也会以某种方式实现引用计数。

请参阅http://www.boost.org/doc/libs/1_54_0/libs/smart_ptr/shared_ptr.htm

于 2013-07-03T09:14:31.827 回答
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);

这个不会漏的。

于 2013-07-03T09:42:03.657 回答