调用析构函数以释放C++运算符中的内存的正确方法是什么
What is the proper way to call the destructor to free up memory in a C++ operator?
我很难知道我做错了什么。
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;
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 使 std::vector 分配对齐内存的现代方法
- 内存效率表示最短路径的方法?
- 一种从内存中删除 UTF 字节的方法?
- 删除类成员的动态分配内存的最佳方法是什么
- 在指向现有内存地址的 hpp 文件中声明成员函数的最佳方法
- 释放 std::vector 中指针内存的最有效方法是什么?
- 有什么方法可以识别可用的内存地址吗?
- avcodec_open2方法中的 FFMPEG 内存泄漏
- 组织从内存读取的数据的最佳方法(用于调试)c++
- 识别打开的共享内存状态的方法
- 释放分配给大量矢量的内存的最有效方法是什么?
- 为大无符号整数分配内存的有效方法
- C ++中新分配的int的内存大小,有没有不同更好的方法来查看它?
- 将两位数字转换为低内存表示的最快方法
- 使用删除与智能指针释放内存以及释放内存的正确方法
- C ++中的几种分配内存方法有什么区别
- 游戏循环中的可变内存方法范围