C++:我需要 "if" 析构函数语句吗?
C++: Do I need "if" statement for destructor?
我认为我下面的 Vector class 的析构函数应该有 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 double;
,因此不需要。始终调用 delete [] arr;
。也不需要检查 NULL
。
这不仅没有必要,而且这是非法的,因为您只使用 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 关键字创建分配的内存时删除没有方括号的内存,避免混淆它们。
我认为我下面的 Vector class 的析构函数应该有 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 double;
,因此不需要。始终调用 delete [] arr;
。也不需要检查 NULL
。
这不仅没有必要,而且这是非法的,因为您只使用 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 关键字创建分配的内存时删除没有方括号的内存,避免混淆它们。