【问题标题】:How to delete an array of pointers to generic type objects如何删除指向泛型类型对象的指针数组
【发布时间】:2013-01-27 23:23:00
【问题描述】:

我的班级有一个名为 A 的通用指针成员数组:

T** A

目前,我通过以下方式删除析构函数中的数组:

~MyQuickInitArray(){
    delete [] A;
};

这会导致内存泄漏吗?如果是这样,我应该遍历数组并在每个对象上调用 delete 吗?

附带说明 - 如果B 是整数数组或者析构函数已经处理它,我是否需要调用delete [] B

编辑:

这是分配发生的方式:

MyQuickInitArray(int size)
{
    if(size <= 0)
    {
        throw new std::exception;
    }

    _size = size;
    _counter = 0;
    A = new T*[size];
    B = new int[size];
    C = new int[size];
}
    MyQuickInitArray(const MyQuickInitArray& myQuickInitArray)
    {
        _size = myQuickInitArray._size;
        _counter = myQuickInitArray._counter;
        A = new T*[_size];

        for(int i = 0; i<_size ;i++)
        {
            if(myQuickInitArray.A[i] != NULL)
            {
                A[i] = new T(*myQuickInitArray.A[i]);
            }
        }

        B = myQuickInitArray.B;
        C = myQuickInitArray.C;
    }

【问题讨论】:

  • 除非您显示分配代码,否则如何判断解除分配代码是否正确?
  • @user1929959 A 不是指向指针数组的指针
  • @AlokSave 请查看我的编辑
  • 哇,为什么这是throw new std::exception;??通过引用捕获值抛出(可能是 const)。
  • @AlokSave 你能详细说明这有什么问题吗?

标签: c++


【解决方案1】:

这会导致内存泄漏吗?

如果A 是一个指针数组,你肯定可以指望它。您需要遍历数组并自己删除指针。

~MyQuickInitArray {
    for (int i =_size; i--;) {
        delete A[i];
    }
    delete [] A;
}

如果B 是整数数组或者析构函数是否处理它,我是否需要调用delete [] B

是的,总是删除用new 分配的那个。您可以在类的析构函数中执行此操作。

【讨论】:

  • 您在程序中使用了delete。这是不正确的。您应该使用适当的智能指针。
  • 首先它不是不正确的,其次从你的措辞来看,OP 也值得一票否决。
【解决方案2】:

这会导致内存泄漏吗?

是的,在指针数组上调用 delete[] 而不删除单个元素所指向的项会导致内存泄漏,因为 C++ 的“内置”指针没有所有权语义。考虑使用“智能”指针,例如unique_ptr&lt;T&gt; 而不是“普通”的,以避免在循环中调用析构函数。

如果 B 是整数数组,是否需要调用 delete [] B

无论数组的元素类型如何,您都需要对使用new[] 分配的所有内容调用delete[]

【讨论】:

  • 你应该更加强调unique_ptr的使用。
猜你喜欢
  • 1970-01-01
  • 2010-10-22
  • 2011-09-14
  • 2014-01-26
  • 2023-02-09
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 2020-08-24
相关资源
最近更新 更多