2017-11-17 109 views
0

我陷入了刪除動態分配的int數組。 我有一個析構函數,我試圖使用循環來刪除數組的所有元素,並最終刪除它。 我在http://rextester.com/OTPPRQ8349的代碼 謝謝!如何刪除C++中的動態分配數組?

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() 
{ 
} 
+0

This works http://rextester.com/CMN81398 –

+0

刪除必須與分配對稱!你一次分配數組,然後一次解除分配數組。 –

+1

不相關:'sizeof(c)'不會給你'c'指向的緩衝區的大小。它會給你指針的大小,地址的大小,以字節爲單位。大部分時間不是很有用。 – user4581301

回答

4

刪除for循環,但保留delete[] c後面。

每個int不需要刪除,因爲它們不是動態分配的。如果您需要刪除它們,則for循環將無法工作:sizeof(c)不是陣列的大小,而delete[]應該是delete

+0

不幸刪除[] c不起作用。你可以檢查它,我添加了鏈接到在線C++編譯器 – tylkonachwile

+0

for循環中的刪除不起作用,刪除那一個。 'delete [] c'應該可以工作。 – fgb

+0

@tylkonachwile該行不會產生錯誤; 'for'循環中的一個是。下面是你自己理解的方法:'new'表達式給你一個指針;這個指針*和只有這個指針*應該傳遞給'delete'。 'delete'應該有'[]'* if和** only if if *,相應的'new'。你不想'刪除'數組中的每個元素,除非它是一個指針數組,每個指針都對應於'new'd。 –

3

代碼中有幾個問題。

首先,析構函數中的那個循環必須去。如果你沒有new呢,請不要delete吧。

其次,通過N元素數組的循環應該是for (int i = 0; i < N; ++i)。請注意,該測試是i < N,而不是i <= N。當前寫入的循環離開數組的末尾。這不好。

第三,複製構造函數複製指針。當第一個對象超出範圍時,它的析構函數將刪除該數組;當副本超出範圍時,其析構函數也將刪除數組。再次,不好。複製構造函數必須複製數組。爲了做到這一點,類還需要存儲數組元素的數量。

+0

哇,一個驚人的接近,解釋超過必要的,現在一切都很清楚,謝謝 – tylkonachwile