C++:我是否需要析构函数的"if"语句?

mja*_*mja 2 c++ 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;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 10

不仅没有必要,它只是不正确.创建的任何内容new []都只能删除delete [].否则会产生未定义的行为.


Nat*_*ica 6

这不仅是必要的,而且这是非法的,因为你只分配内存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或正确释放从构造函数分配的内存.