运算符的使用=与新运算符组合使用
Use of operator= combined with new operator
我想知道如何编写运算符=
,以便释放变量上现有的已分配内存。
例如,在下面的代码中,当重新分配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;
}
永远不要打破这个规则:每个new
都必须与一个delete
平衡。
你可以使用智能指针来实现你想要的东西,或者,在你的特定情况下,使用更简单的东西:
简单地说,您为数据类型T构建了一个WrappedPtr<T>
模板类,该类包含T*
指针。作为起点,您可以定义一个赋值运算符,该运算符将删除当前包装的对象,然后将新对象作为其成员数据。你需要注意复制结构;甚至禁止。
真正的智能指针也将以某种方式实现引用计数。
请参阅http://www.boost.org/doc/libs/1_54_0/libs/smart_ptr/shared_ptr.htm
运算符=表示您正在更改当前对象内部的值。在这里,您只是在更改指针x。
你可以这样做:
ClassExample x(2);
x = ClassExample(4);
或者,在你的情况下,类似于:
ClassExample* x = new ClassExample(2);
*x = *(new ClassExample(4));
最后一个会在你的程序中引入泄漏,所以不要使用它。当然,你可以使用介于两者之间的东西,比如:
ClassExample* x = new ClassExample(2);
*x = ClassExample(4);
这个不会泄漏。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 当返回语句时,逗号运算符、大括号初始化列表和 std::unique_ptr 组合在一起
- 为什么我"error: expression is not assignable"组合增量运算符
- 编写饱和转换运算符而不列出所有可能的组合
- 如何使用超载 运算符组合两个链接列表
- 覆盖组合对象的<<运算符会给出错误 C++
- 组合 & 和 * 运算符
- 重载运算符 "=" 和 "+" 组合在 C++ 中不起作用
- 如何计算前缀和后缀运算符的组合
- C std::lower_bound,使用重载运算符作为二进制谓词组合
- C++ - 组合复制/移动运算符和构造函数
- 重载用于组合使用向量的两个字典的+运算符
- 运算符的使用=与新运算符组合使用
- 函数组合运算符
- 运算符<<和继承/组合
- 调用枚举<<运算符进行字符串组合
- 重载运算符和继承与模板(强大的组合)
- 关于>>、<<运算符和 cin 和 cout 对象组合的问题