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

昏暗的

我在理解如何在以下程序的第二类中编写析构函数时遇到了麻烦:

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;
}
重复数据删除器

在我发现的所有类似问题中,使用new这样的方法为数组的每个元素动态分配一个值:arr[i] = new First();但是,此处为元素分配了指向对象的指针的值,该对象是函数的参数。那么,析构函数应该先删除每个元素然后删除数组,还是足以删除数组?

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

  1. 如果没有所有权,只需删除该阵列就足够了,并且应该通过std::unique_ptr这样做来管理该阵列

  2. 如果确实拥有所有权,则该参数.add()应该是具有正确的所有权语义和删除器的智能指针。然后,您的数组应该是这些智能指针的数组,由进行管理std::unique_ptr

无论哪种情况,如果您正确使用智能指针,都可以使用default-dtor。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章