如何在c ++中删除动态分配的数组?

时间:2017-11-17 23:57:53

标签: c++

我因删除动态分配的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()
{
}

2 个答案:

答案 0 :(得分:4)

删除for循环,但保留delete[] c之后。

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

答案 1 :(得分:3)

代码中存在几个问题。

首先,析构函数中的循环必须继续。如果您没有new,请不要delete

其次,N元素数组的循环应为for (int i = 0; i < N; ++i)。请注意,测试为i < N,而非i <= N。当前写入的循环离开数组的末尾。那不好。

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