调用析构函数以释放C ++运算符中的内存的正确方法是什么?

时间:2012-05-06 10:58:57

标签: c++

我很难知道自己做错了什么。

Huge& Huge::operator *=(const Huge& h) {
    Huge retHuge = *this * h;
    string out1 = retHuge.toString(); // for debugging purposes
    return *this = retHuge;
//  return retHuge;
}

Huge retHuge = *this * h;

在我在字符串out1中验证时工作正常。如果我返回retHuge并在调用例程中打印结果,我可以看到原始值保持不变。如果我执行*this = retHuge并返回*this,则会出现SEGSEGV错误。

调用析构函数清理内存并在乘法后返回结果的正确方法是什么?

我要感谢你们所有人的答案。 Crazy Eddie使用了我所拥有的并扩展了它,这正是我想要做的。我更改了源代码以反映他的建议,并且出现了SEGSEGV故障。

我认为这意味着我的语法必须基本正确但我的代码中隐藏了一个错误。这是有价值的信息,我需要回过头来仔细查看是否可以找到一些东西。在我正确完成作业之前,我不想懒惰并寻求帮助,所以我先看一看。

我的经验主要是Java,它为未引用的对象提供了一个很好的垃圾收集器。我将使用调试器并验证是否正在调用我的析构函数来释放内存。

这是一个很好的提示,首先尝试执行* =运算符,然后从中构建=运算符。显然,我做的事情正朝着相反的方向发展。你的答案似乎仍然表明我所做的应该确实有效。由于它不起作用,我会回去看看能不能找到任何东西。如果在我完成作业后,我仍然找不到任何东西,我会继续问。在此期间,感谢所有的帮助。

4 个答案:

答案 0 :(得分:8)

canonical form of overloading arithmetic operators适用于您的具体案例:

Huge& Huge::operator *=(const Huge& h) // class member function
{
  // somehow multiply h's value into this' value
  return *this;
}


Huge operator*(Huge lhs, const Huge& rhs) // free function; note lhs being copied
{
  lhs *= rhs;  // *= already implemented above
  return lhs;
}

这里根本没有涉及动态内存,因此您无需删除任何动态内存。

复合赋值表单应该是the operator overloading rules of thumb的成员,因为它更改了它的左侧操作数(并且可能需要访问类的私有部分)。非赋值版本应该是一个自由成员函数,以便隐式转换可以同等地应用于两个操作数。

答案 1 :(得分:2)

delete this;之后,*this正在写入未分配的记忆。

相反,只需说出*this = retHuge(不含delete this),然后return *this

改为处理operator =中的释放。

这是一个完整的示例,具有int *的虚构复杂有效载荷:

#include <iostream>

class A {
public:
    A(int _val): val(new int(_val))
    { }

    ~A() {
        delete this->val;
    }

    A &operator =(const A &r) {
        // Pretend this->val is complex and we need to reallocate the
        // entire thing.
        delete this->val;

        this->val = new int(*r.val);

        return *this;
    }

    A operator *(const A &r) const {
        return A(*this->val * *r.val);
    }

    A &operator *=(const A &r) {
        return *this = *this * r;
    }

    int *val;
};

int main() {
    A x(5), y(10);
    x *= y;

    std::cout << "x: " << *x.val << ", y: " << *y.val << std::endl;
    return 0;
}

答案 2 :(得分:1)

由于您似乎已经拥有*运算符,并且我将在此时假设分配有效,这将是最佳实现:

Huge& Huge::operator *=(const Huge& h) {
    Huge retHuge = *this * h;

    return *this = retHuge;
}

答案 3 :(得分:0)

operator=表示您将右手网站分配到

因此,您应该更改的内容,然后最后更改return *this;