C++:析构函数需要"if"语句吗?
C++: Do I need "if" statement for destructor?
我认为下面Vector类的析构函数应该有if
语句来取消它使用的内存。如果arr
有一个成员,它将有delete arr
。如果arr
有很多成员,我必须使用delete[] arr
。
你能告诉我这是必要的吗
我的代码:
class Vector {
double * arr;
short dim;
public:
Vector(short d = 0): dim(d) {
arr = NULL;
if (dim < 0) {
dim = 0;
} else {
arr = new double[dim];
}
}
~Vector() {
if (arr != NULL) {
if (dim == 1) {
delete arr;
} else {
delete[] arr;
}
arr = NULL;
dim = 0;
}
}
};
这不仅没有必要,而且是不正确的。使用new []
创建的任何内容只能使用delete []
删除。否则会创建未定义的行为。
这不仅不是必要的,而且是非法的,因为您只使用new[]
分配内存。如果您呼叫new
,则需要delete
;如果您呼叫new[]
,则需要呼叫delete[]
。混合它们是未定义的行为。你的矢量应该看起来像:
class Vector {
double * arr;
short dim;
public:
Vector(short d = 0): dim(d) {
if (dim > 0)
arr = new double[dim]
else
arr = nullptr;
}
Vector(const Vector& copy) : dim(copy.dim) {
if (dim > 0) {
arr = new double[dim]
// copy data here
}
else
arr = nullptr;
}
~Vector() {
delete [] arr;
}
Vector & operator=(Vector rhs) {
// swap the contents of the copy. you can make a swap function to do this
double * temp = arr;
arr = rhs.arr;
rhs.arr = temp;
dim = rhs.dim;
}
};
现在我们有了正确的副本,删除将是nullptr
上的非操作,或者正确地释放从构造函数分配的内存。
您从不在任何地方调用new double;
,因此不需要它。请始终致电delete [] arr;
。也不需要检查NULL
。
相关文章:
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- c++:定义if语句中的模板
- C++嵌套的 If 语句中,它无法按预期工作
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 需要有关此 if 语句的帮助
- 转换器练习:跳过 if 语句和 if 语句
- 避免在 C++ 中的 if 语句中递增
- 如果仍然不满足要求,如何使 if 语句重复?
- do while 循环中的 if 语句以 yes 或 no 结尾
- 为什么在此C++代码中触发此 if 语句?
- 如何基于平台在制作文件中制作if语句?
- 在 if 语句中使用 GetKeyState 时,它会跳过条件
- C++ If 语句,从其他语句重复