2016-03-22 9 views
-1

habe ich eine Funktion, um einen dynamischen 3D-Arrayin c 3d Dynamische Array lösche ++

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]; 
     } 
    } 
} 

Und es funktioniert gut zu initialisieren, aber wenn ich versuche, es mit einer Funktion

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; 
} 

Mein Programm stürzt ab, zu löschen , Warum? und wie repariere ich es?

Im Haupt:

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

Um dies zu beheben, verwenden Sie einfach std :: vector , sodass Sie sich keine Gedanken darüber machen müssen, es zu löschen. –

Antwort

0

Für Starter Funktion initialize_array_3d ist falsch. Es sollte mindestens die folgende Art und Weise aussehen

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]; 
     } 
    } 
} 

Das ist der erste Parameter sollte indirekt mit Zeiger übergeben werden.

könnte Ein Funktionsaufruf aussehen

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

Ansonsten Parameter char ***Array eine lokale Variable der Funktion und die Funktion befasst sich mit einer Kopie des Arguments ist. Änderungen der lokalen Variablen haben keinen Einfluss auf das ursprüngliche Argument.

Oder Sie könnten den Parameter als Referenz auf den Pojnter deklarieren. Zum Beispiel

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]; 
     } 
    } 
} 

In diesem Fall ist der Funktionsaufruf wie

aussehen könnte
initialize_array_3d(Failed, 5, 4, 2); 
        ^^^^^^ 

Was Funktion deinitialize_array_3d dann sollte es so aussehen

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

Sie verwenden size1 + 1 eine Schleife durch das Array statt size1, sondern weil die Anordnung von size1 ist, können Sie nicht zugreifen Element size1. In der Initialisierung kommst du damit durch (es ist undefiniertes Verhalten), aber du kannst Speicher, den du nicht besitzt, nicht löschen, so dass dein Programm abstürzt.


Verwenden Sie stattdessen eine std::vector.