【问题标题】:How to delete dynamic allocated array in c++?如何在 C++ 中删除动态分配的数组?
【发布时间】:2018-05-01 20:12:39
【问题描述】:

我无法删除动态分配的 int 数组。 我有一个析构函数,我试图使用循环来删除数组的所有元素,最后删除它。 我在http://rextester.com/OTPPRQ8349 上有代码 谢谢!

class MyClass
{
   public:
   int _a;
   int* c;
   int fRozmiar;
   static int fIlosc;
   MyClass() //default constructor
   {
       _a=0;
       c = new int [9];
       for(int i = 0; i<=9; i++)
       {
           c[i] = 1;
       }
       fIlosc++;
   }
   MyClass(int a1, int c1) // parametrized constructor
   {
       _a=a1;
       c = new int [c1];
       for(int i = 0; i<=c1; i++)
       {
           c[i] = rand();
       }
       fIlosc++;
   }
   MyClass(const MyClass &p2) // copy constructor
   {
    _a =p2._a;
    c = p2.c;
    fRozmiar = p2.fRozmiar;
    fIlosc = fIlosc;
    fIlosc++;
   }
    ~MyClass(); // destructor

    static int getCount() {
         return fIlosc;
      }
};

//Initialize static member of class
int MyClass::fIlosc = 0;
MyClass::~MyClass()
{
        for(int i = 0; i<sizeof(c); ++i)
        {
            delete[] c[i];
        }
        delete[] c;
       fIlosc--;
}
int main()
{
}

【问题讨论】:

  • 删除必须与分配对称!您一次分配了数组,然后一次释放了它。
  • 无关:sizeof(c) 不会为您提供c 指向的缓冲区大小。它会给你指针的大小,地址的大小,以字节为单位。大多数时候不是很有用。
  • 不相关:在复制构造函数中c = p2.c; 是一个致命错误。您现在有两个对象指向同一个分配。当析构函数为这些对象之一运行时,另一个对象的内存将消失。如果程序在尝试使用已释放内存的另一个对象上没有崩溃,那么当另一个对象被删除并尝试删除已经被删除的内存时,将会发生一些可怕的事情(可能是崩溃)。
  • 无关:fIlosc = fIlosc; 将变量分配给自身。因为这个变量是静态的,所以两个对象都是一样的,所以没有必要这样做。

标签: c++


【解决方案1】:

删除 for 循环,但在其后保留 delete[] c

每个int 都不需要删除,因为它们不是动态分配的。如果您需要删除它们,那么 for 循环将不起作用,因为:sizeof(c) 不是数组的大小,delete[] 应该是 delete

【讨论】:

  • 不幸的是 delete[] c 不起作用。你可以检查一下,我添加了在线c++编译器的链接
  • for循环中的删除不起作用,删除那个。 delete[] c 应该可以工作。
  • @tylkonachwile 该行没有产生错误; for 循环内的那个是。以下是自己理解的方法:new 表达式给你一个指针;这个指针并且只有这个指针应该被传递给deletedelete 应该有[] if,并且only if,对应的new 有。你不想delete数组的每个元素,除非它是一个指针数组,并且每个指针都对应于newd。
【解决方案2】:

代码中有几个问题。

首先,析构函数中的循环必须执行。如果你没有new它,就不要delete它。

其次,通过N 元素数组的循环应该是for (int i = 0; i &lt; N; ++i)。请注意,测试是i &lt; N,而不是i &lt;= N。当前编写的循环离开数组的末尾。这不好。

第三,复制构造函数复制指针。当第一个对象超出范围时,它的析构函数会删除数组;当副本超出范围时,其析构函数删除数组。再次,不好。复制构造函数必须制作数组的副本。为了做到这一点,该类还需要存储数组元素的数量。

【讨论】:

  • 哇,一个了不起的方法,解释的比必要的多,现在一切都清楚了,谢谢
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多