【问题标题】:Use of operator= combined with new operator使用 operator= 结合 new 运算符
【发布时间】:2013-07-03 09:12:08
【问题描述】:

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

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

【问题讨论】:

  • 在这种情况下不会调用您的赋值运算符,因为您使用的是指针而不是直接实例。还要记住,分配的内存永远不会自动释放,你必须这样做。使用 smart pointers 会有所帮助。
  • 其实在这种情况下,为什么你要使用指针呢?我不仅指main 中的ClassExample 指针,还指类中的成员指针a!您应该遵循的规则是: 1. 不要使用指针。 2.如果你必须使用指针,不要。 3.如果你仍然必须使用指针,那么使用智能指针。
  • 也要考虑异常安全

标签: c++ copy assign


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    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);
    

    这个不会泄露的。

    【讨论】:

    • 它可能不会泄漏val,但是调用new应该通过调用delete来匹配,否则它泄漏
    • 我的上一个例子没有问题,第一个“ClassExample(2)”仍然存在,复制完成后“ClassExample(4)”将被破坏。然后,当然,必须在程序结束时删除“x”。
    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 2012-11-06
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多