我认为我下面的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;
}
}
};
Run Code Online (Sandbox Code Playgroud)
这不仅是必要的,而且这是非法的,因为你只分配内存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;
}
};
Run Code Online (Sandbox Code Playgroud)
现在我们有正确的副本,删除将是非操作nullptr或正确释放从构造函数分配的内存.