2016-06-25 5 views
-3

Ich versuche, Rechnungen und ihre Nummern (Kennungen) zu machen. Ihre Nummern werden automatisch generiert und sind 9 Zeichen lang.C++ Speicherfreigabe, wird es in diesem Fall benötigt?

Hier ist mein Code :

#include <iostream> 
using namespace std; 

int counter = 1234; 
char * BillNumber() 
{ 
    if (counter == 1) 
    { 
     counter++; 
     return "000000001"; 
    } 

    int n = 0, c = counter; 

    while (c != 0) 
    { 
     n++; 
     c /= 10; 
    } 

    char * nrBill = new char[n + 1]; 
    _itoa_s(counter, nrBill, n + 1, 10); 
    nrBill[n + 1] = '\0'; 

    int difference = 9 - n; 
    if (difference == 0) 
     return nrBill; 

    char * helper = new char[difference + 1]; 
    for (int i = 0; i < difference + 1; i++) 
    { 
     helper[i] = '0'; 
     if (i == difference) 
      helper[i] = '\0'; 
    } 

    strcat_s(helper, 10, nrBill); 
    counter++; 
    return helper; 
} 

int main() 
{ 
    char * bill[10]; 

    for (int i = 0; i < 10; i++) 
    { 
     bill[i] = BillNumber(); 
    } 

    for (int i = 0; i < 10; i++) 
    { 
     cout << bill[i] << endl; 
    } 

    //Deallocation 
    /*for (int i = 0; i < 10; i++) 
    { 
     delete[] bill[i]; 
    }*/ 
    return 0; 
} 

Wenn ich versuche, den Speicher freizugeben, wie im Kommentar, ich einen Fehler. Ich verstehe, warum ich es verstehe, ich meine, ich habe nicht einmal mein Gedächtnis in der main Funktion zugewiesen. Also muss ich es tatsächlich in der Funktion BillNumber freigeben. Aber ich denke nicht, dass das auch in der Funktion benötigt wird.

Also meine Frage ist:

Ist Speicherfreigabe hier tatsächlich benötigt?

: Ich weiß, dass ich nicht c bin mit ++ Codierungsstandards, also bitte nicht beschweren über die *

+3

Ihr Code ist voller Fehler. Und das ist trotz des Auftretens kein Debugging-Service. – juanchopanza

+6

Warum denken Sie, dass Speicherfreigabe nicht benötigt wird? Jedes Mal, wenn Sie Speicher mit 'new' belegen, müssen Sie die Zuweisung mit' delete' aufheben. Die Regel ist ziemlich einfach. Sie können es noch einfacher machen, indem Sie RAII- und Standard-C++ - Idiome verwenden, aber Sie haben anscheinend einen Grund, diese zu vermeiden. –

+0

@CodyGray Nun, ich bin mir jetzt bewusst, dass ich die 'nrBill' in meiner Funktion' BillNumber() 'freigeben muss, aber wie kann ich' helper' entziehen? Ich meine, ich kann so etwas nicht machen: 'delete [] helper; return helfer; ' – Kapobajza

Antwort

1

Da Sie diese char * nrBill = new char[n + 1]; tun und diesen char * helper = new char[difference + 1]; Sie tatsächlich das Zuweisen von Speicher auf Heap sind. , das nicht freigibt, außer du nennst es explizit. Sie sollten anrufen:

delete []nrBill; 
delete []helper[]; 

vor der Rückkehr von der Funktion, sonst erhalten Sie ein Speicherleck. Die Objekte nrBill und helper werden niemals bis zum Ende des Programms freigegeben, was in Ihrem Fall kein Problem ist, da es bald beendet wird und der Speicher wiederhergestellt wird, aber wenn Sie eine Anwendung entwickeln, die Speicherlecks erzeugt und arbeitet für längere Zeit, dann wird es ein echtes Problem sein.

+0

Ich bin mir bewusst, dass ich [] nrBill löschen muss, aber wenn ich '[helper] lösche, wie werde ich es dann zurückgeben? Ich kann keinen leeren Zeichenzeiger zurückgeben. – Kapobajza

+0

delete [] Helfer sollte in Ihrer Hauptfunktion aufgerufen werden, sorry! Und mit dem Namen gibst du es dort, wie lösche [] Rechnung. – meJustAndrew

0

allererst Sie ausplanen nicht nrBill wenn Sie helper zurück. Das ist ein Speicherleck und ein Problem.

Was Ihre Frage ist die Speicherfreigabe erforderlich, da Sie manuell Speicher zugewiesen haben. In Ihrem Fall wird es jedoch (abgesehen von dem oben erwähnten) keinen Speicherverlust geben, da das Programm beendet ist (Hauptrückgaben) und der gesamte zugewiesene Speicher sowieso freigegeben wird.

2

Ich meine, ich habe nicht einmal meinen Speicher in der Hauptfunktion zugeordnet. Also muss ich es tatsächlich in der Funktion BillNumber freigeben. Aber ich denke nicht, dass das auch in der Funktion benötigt wird.

Wo die Zuteilung passiert ist egal, der Punkt ist, wenn Sie etwas zugewiesen haben, müssen Sie es freigeben. Für Ihren Code, du, weil du immer noch die Zeiger nach BillNumber() genannt Verwendung in main(), müssen Sie sie in main() später freizugeben.

Wenn ich versuche, den Speicher wie im Kommentar freizugeben, erhalte ich einen Fehler.

Sie müssen das Programm debuggen die wirklichen Probleme zu erfahren, hier ist eine von der Möglichkeit:

char * nrBill = new char[n + 1]; 
_itoa_s(counter, nrBill, n + 1, 10); 
nrBill[n + 1] = '\0'; 

nrBill[n + 1] aus dem dem Arrays gebunden zu bekommen.