2017-02-16 3 views
0

Dies ist mein einfaches Programm, das zwei Funktionen hat, eine ist es, eine Reihe von Fibonacci zu erstellen und sie dann einem Array hinzuzufügen. Ein anderes wird verwendet, um das Array freizugeben, aber es funktioniert nicht. Kann mir jemand helfen?Wie man dieses Array freigibt

int **createFibArray(int n){ 

    int **arr = new int*[n]; 
    int fnum1 = 1,fnum2=1,fnum; 

    // n== 1 
    if(n == 1){ 
     arr[0] = new int; 
     *arr[0] = 1; 
     return arr; 
    } 

    // n>= 2 
    arr[0] = new int; 
    arr[1] = new int; 
    *arr[0] = 1; 
    *arr[1] = 1; 

    // fib calculator 
    for(int i=2; i<n; i++){ 
     fnum = fnum1 + fnum2; 
     fnum1 = fnum2; 
     fnum2 = fnum; 

     arr[i] = new int; 
     *arr[i] = fnum; 
    } 
    return arr; 
} 


//This function takes an array pointer, and deallocates memory 
void removeArray(int head[]){ 
    delete [] head; 
    head = nullptr; 
} 

int main(){ 

    int **head = createFibArray(10); 
    for(int i=0;i<10;i++){ 
     cout << *head[i] << endl; 
    } 
    cout << "------" << endl; 
    removeArray(*head); 
     for(int i=0;i<10;i++){ 
     cout << *head[i] << endl; 
    } 
    return 0; 
} 
+3

Schnelle Frage: Warum ein Array von Zeigern zu einem einzigen 'int'? Sie werden viel weniger Probleme mit einem Array von "int" haben und es wird wahrscheinlich die gleiche Größe oder kleiner sein. – user4581301

+0

Woher wissen Sie, dass es nicht funktioniert? – immibis

+2

[ASan] (http://clang.llvm.org/docs/AddressSanitizer.html) sagte mir, dass Sie Speicher mit 'new' zuweisen, wenn Sie' arr [0] = new int; 'und' löschen' Sie es mit 'lösche [] head;'. Du darfst das nicht. Sie müssen 'new' mit' delete' und 'new []' mit 'delete []' verbinden. – nwp

Antwort

0

Sie müssen in Betracht ziehen, ein Array von Ganzzahlen und nicht ein Array von Integer-Zeigern zurückzugeben. Wenn Sie darauf bestehen, einen rohen Zeiger, anstatt einen STL-Container zur Verwendung:

int **createFibArray(int n)

Sollte

int *createFibArray(int n)

werden, und dies:

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

wird diese:

int *arr = new int[n]; 

Dann können Sie die * von fast jedem Ort entfernen, die Sie verwenden, und die Löschfunktion kann ziemlich unverändert bleiben. Sie werden die Anruf ändern auf die Löschfunktion:

removeArray(*head);

wird:

removeArray(head);

Allerdings ist der Wert nullptr in der Funktion Einstellung wertlos. tun Sie dies entweder nach dem Anruf an removeArray oder lassen Sie es ganz weg, wenn Sie sicher sind, dass es nach dem Löschen nie wieder verwendet wird.

Das bringt uns zum letzten Teil Ihrer main Funktion. Wenn Sie einen Zeiger nach dem Löschen löschen (oder in diesem Fall versuchen, ihn zu löschen), ist das Verhalten nicht definiert.