C++:析构函数需要"if"语句吗?

C++: Do I need "if" statement for destructor?

本文关键字:if 语句 析构函数 C++      更新时间:2023-10-16

我认为下面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

不,这不是必须的。确保在创建已分配内存时,使用new关键字删除不带方括号的内存,避免混淆它们。