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

What is the proper way to call the destructor to free up memory in a C++ operator?

本文关键字:内存 方法 是什么 析构函数 释放 C++ 运算符 调用      更新时间:2023-10-16

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

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 保持不变。如果我做一个*this = retHuge并返回*this,我会得到一个SEGSEGV错误。

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

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

我认为这意味着我的语法必须基本正确,但我在其余代码中隐藏了一个错误。这是有价值的信息,我需要回去非常仔细地寻找,看看我是否能找到一些东西。我不想偷懒,在我做好作业之前寻求帮助,所以我先好好看看。

我的经验主要是Java,它有一个很好的垃圾收集器,用于未引用的对象。我将完成调试器,并验证是否正在调用我的析构函数以释放内存。

这是一个很好的提示,可以尝试先做 *= 运算符,然后从中构建 = 运算符。显然,我做了相反的事情。你的回答似乎表明我所做的确实应该奏效。既然不行,我就回去看看能不能找到什么。如果做完功课后,我仍然找不到任何东西,我会继续问。同时,感谢您的所有帮助。

重载算术运算符的规范形式适用于您的特定情况:

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

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

根据运算符重载的经验法则,复合赋值表单应该是成员,因为它会更改其左侧操作数(并且可能需要访问类的私有部分(。非赋值版本应为自由成员函数,以便隐式转换可以平等地应用于两个操作数。

不要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;
}

由于您似乎已经有了 * 运算符,并且此时我将假设赋值有效,这将是最好的实现:

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

operator=表示您将右侧站点分配给站点。

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