C ++:如何在类析构函数中正确删除指向指针的数组

时间:2018-04-02 19:51:01

标签: c++ arrays class pointers destructor

我无法理解如何在下面的程序的第二个类中编写析构函数:

class First
{
    // Assume this is a virtual class
};

class Second
{
    private:
        int index;
        First **arr;

    public:
        Second(int size)
        {
            index = 0;
            arr = new First*[size]; // Please bear with my use of new
        }

        ~Second() {}

        void add(First *f)
        {
            arr[index++] = f;
        }
};

在我发现的所有类似问题中,数组的每个元素都动态分配一个值,使用new:arr[i] = new First();。但是,这里为元素分配指向对象的指针的值,该对象是函数的参数。那么,如果析构函数逐个删除每个元素然后删除数组,或者是否足以删除数组?

~Second()
{
    for(int i = 0; i < index; ++i) delete[] arr[i]; // Is this necessary?
    delete[] arr;
}

2 个答案:

答案 0 :(得分:1)

首先在构造函数中分配后,最好在数组中保留NULL。

    int arr_size; // you need to define this for the reference in destructor

    Second(int size)
    {
        arr_size = size;
        arr = new First*[size]; // Please bear with my use of new
        for (int i = 0; i < size; i++)
            arr[i] = NULL;
    }

然后,在析构函数中,只有当元素不是NULL时才删除元素。

    ~Second()
    {
        for(int i = 0; i < arr_size; i++)
            if (arr[i]) 
                delete arr[i];
        delete[] arr;
    }

答案 1 :(得分:1)

  

在我发现的所有类似问题中,数组的每个元素都动态分配一个值,使用new:arr[i] = new First();。但是,这里为元素分配指向对象的指针的值,该对象是函数的参数。那么,如果析构函数逐个删除每个元素然后删除数组,还是删除数组呢?

那,我们无法回答。 Second是否拥有传递给.add()的对象的所有权,如果是,那么它们是如何分配的?

  1. 如果它不取得所有权,只需删除数组就足够了,该数组应该由std::unique_ptr为您管理。

  2. 如果确实需要所有权,那么.add()的参数应该是具有正确所有权 - 语义和删除的智能指针。然后,您的数组应该是由std::unique_ptr管理的智能指针数组。

  3. 在任何一种情况下,如果你正确使用智能指针,默认的dtor就可以了。