2013-11-14 62 views
0

我提出的一些對象的堆的2D陣列:數組如何在內存中存儲和刪除?

工序(1)

Obj **arr = new Obj *[n]; 

for (int i=0;i<n;i++) 
{ 
    arr[i] = new Obj[n]; 
} 

//所以這產生2D ARR [N] [N] ...然後當我刪除它:

步驟(2)

for (int i=0;i<n;i++) 
{ 
    delete [] arr[i]; 
} 
delete [] arr; 

所以我仍然不知道這是什麼做刪除。它運行Obj的析構函數並標記操作系統告訴它這是現在可用的內存。

現在我真的不明白的是,當我再次執行Step(1)(刪除後)時,我將這些對象初始化爲奇怪的值,但這並不是在我第一次執行它時發生的初始化爲零)。我第一次幸運嗎?

回答

0

AFAIK,下面的代碼不會給你奇怪的值,無論你重複刪除和新增多少次。

#include <iostream> 
using namespace std; 

class Foo 
{ 
public: 
    Foo(): val(-2) { cout << "ctor" << endl; } 
    ~Foo() { cout << "dtor: " << val << endl; } 

private: 
    int val; 
}; 

int main() 
{ 
    Foo **arr = new Foo *[2]; 
    for (int i = 0; i < 2; ++i) 
     arr[i] = new Foo[2](); // <- for builtin type,() is required to initialized to zero. 

    for (int i = 0; i < 2; ++i) 
     delete [] arr[i]; 
    delete [] arr; 
    return 0; 
} 

相關的職位:Operator new initializes memory to zero

至於發生了什麼指針你刪除後,請看到這個帖子:C - What happens to an array of pointers when the array is freed?

+0

我錯過了什麼嗎?我明白這一點,但它與我的問題有什麼關係? –

+0

@JoshDM對不起,我感到困惑。你能不能發一個你的代碼的例子來產生'怪異'的init值?我試圖表達,如果你使用上面的代碼,你不會得到奇怪的價值,你刪除和新的任何時候。 – gongzhitaao

+0

不幸的是我無法發佈實際的代碼。我得到它工作正常,但我真的不明白爲什麼當我調試刪除循環,我仍然可以訪問arr [0],arr [1],arr [0] [0],...這只是一個怪癖的調試器或是沒有被刪除? –

0

您的示例缺少Obj的聲明。

  • 新的[]分配內存,並呼籲每個元素
  • 的構造函數如果構造不會改變內存中,你會看到一些隨機值 - 也許零。
  • delete []調用之前分配給new []的每個元素的析構函數,並最終釋放內存。
  • 在調試編譯中,內存可能會填充一些字節,指示重新分配。
  • 重新分配後立即執行new []可能會顯示指示符字節。
+0

呀obj是隻是一個隨機類的一些指針和其他簡單的領域。當我gdb的步驟(2)for循環,我發現刪除[] obj [0]後,我仍然可以打印obj [0]和obj [0] [0],除了有一些'時髦'值一些字段 –