2016-03-22 31 views
-1

我做了一個函數來初始化動態三維陣列刪除在C++中三維動態數組

void initialize_array_3d(char ***Array, int size1, int size2, int size3) 
{ 
    Array = new char**[size1]; 
    for (int t=0; t<size1+1; t++) 
    { 
     Array[t] = new char *[size2]; 
     for (int r=0; r<size2+1; r++) 
     { 
      Array[t][r] = new char [size3]; 
     } 
    } 
} 

,它工作正常,但是當我試圖用一個函數來刪除它

void deinitialize_array_3d(char ***Array, int size1, int size2) 
{ 
    for (int t=0; t<size1+1; t++) 
    { 
     for (int r=0; r<size2+1; r++) 
     { 
      delete[] Array[t][r]; 
     } 
     delete[] Array[t]; 
    } 
    delete[] Array; 
} 

我的程序崩潰,爲什麼?我該如何解決它?

在主:

int main() 
{ 
    char ***Failed; 
    initialize_array_3d(Failed, 5, 4, 2); 
    deinitialize_array_3d(Failed, 5, 4); 
    Failed = nullptr; 
    return 0; 
} 
+3

爲了解決這個問題,只是使用std ::矢量,所以你不必擔心刪除它。 –

回答

0

對於初學者功能initialize_array_3d是錯誤的。它應該至少看下面的方式

void initialize_array_3d(char ****Array, int size1, int size2, int size3) 
          ^^^^^^^^^^^^^^ 
{ 
    *Array = new char**[size1]; 

    for (int t = 0; t < size1; t++) 
        ^^^^^^^^^ 
    { 
     (*Array)[t] = new char *[size2]; 

     for (int r = 0; r < size2; r++) 
         ^^^^^^^^^ 
     { 
      (*Array)[t][r] = new char [size3]; 
     } 
    } 
} 

這是第一個參數應該間接使用指針傳遞。

函數調用可能看起來像

initialize_array_3d(&Failed, 5, 4, 2); 
        ^^^^^^^ 

否則參數char ***Array是功能與參數的副本功能的交易的一個局部變量。局部變量的任何更改都不會影響原始參數。

或者你可以聲明參數作爲對pojnter的引用。例如

void initialize_array_3d(char *** &Array, int size1, int size2, int size3) 
          ^^^^^^^^^^^^^^ 
{ 
    Array = new char**[size1]; 

    for (int t = 0; t < size1; t++) 
        ^^^^^^^^^ 
    { 
     Array[t] = new char *[size2]; 

     for (int r = 0; r < size2; r++) 
         ^^^^^^^^^ 
     { 
      Array[t][r] = new char [size3]; 
     } 
    } 
} 

在這種情況下,函數調用可能看起來像

initialize_array_3d(Failed, 5, 4, 2); 
        ^^^^^^ 

至於功能deinitialize_array_3d那麼它應該看起來像

void deinitialize_array_3d(char ***Array, int size1, int size2) 
{ 
    for (int t = 0; t < size1; t++) 
        ^^^^^^^^^ 
    { 
     for (int r = 0; r < size2; r++) 
         ^^^^^^^^^ 
     { 
      delete[] Array[t][r]; 
     } 
     delete[] Array[t]; 
    } 

    delete[] Array; 
} 
0

您正在使用size1 + 1遍歷您的數組,而不是size1,但由於磁盤陣列是size1,你不能訪問元素size1。在初始化過程中,你會逃避它(這是未定義的行爲),但是你不能刪除你不擁有的內存,所以你的程序崩潰了。


請考慮使用 std::vector代替。