Speicherleak??



  • Hallo zusammen

    Entsteht hier ein Speicherleak??
    Wenn ja wieso?

    Mein Erklärungsversuch: ??

    Beim Aufruf der Funktion FuncOne() wird Speicher im Heap allokiert und dem
    Pointer pInt zugewiesen dann wird dieser dem pointer pInt2 zurückgegeben.
    pInt wird durch verlassen der Function zerstört aber der Speicherbereich wurde
    zuvor noch pInt2 zugewiesen also warum entsteht dann hier ein Speicherleak??

    #include <iostream.h>
    int * FuncOne();
    
    int main()
    {   
    	int * pInt2 = FuncOne();   
    	cout << "Wert von pInt nach Rueckkehr in main: " << *pInt2 << endl;   
    	return 0;
    }
    
    int * FuncOne()
    {   
    	int * pInt = new int (5);   
    	cout << "Wert von pInt in FuncOne: " << *pInt << endl;   
    	return pInt;
    }
    


  • Ganz einfach weil du mehr news als deletes im Quelltext hast.
    So wie du es jetzt machst müsstest du im main() ein delete pInt2 vor return 0 machen.. das wäre allerdings schlechter Stil und wird garantiert irgendwann vergessen.

    Besser wäre es wenn du FuncOne in eine Klasse packst und da das new im konstruktor sowie das delete im destruktor machst.



  • Besser wäre es wenn du FuncOne in eine Klasse packst und da das new im konstruktor sowie das delete im destruktor machst.

    nö, besser ist da std::auto_ptr



  • hier wird ja der Speicherbereich von pInt an pInt2 zurückgegeben und dann wird pInt aufgelöst.
    Wenn ich hier den pointer pInt nicht an pInt2 übergeben hätte wäre doch auch ein Speicherleak eintstanden...????

    Das eigendliche Leak eintsteht aber dadurch dass ich zum schluss in der main vergessen habe delete einzusetzen oder??????



  • Ja, du hast das delete vergessen. Es ist egal wo du es machst. Du _musst_ es halt nur machen. In deinem Fall ist es nicht ganz so dramatisch wenn du einmal Speicher anforderst der bis zum Programmende gebraucht wird und dann das delete vergisst. Trotzdem sollte man immer deleten. Das Problem sind Leichen im Speicher die mit der Zeit zunehmen.



  • 1. ja
    2. ja



  • int * pInt = new int (5);
    

    Die Synthax kannte ich noch gar nicht. Ich kenne nur

    int * pInt = new (5) int;
    

    und

    int * pInt = new int [5];
    


  • das erste allokiert Speicher für ein int auf dem FreeStore und initalisiert ihn mit 5 (bzw. bei nicht PODs ruft den ctor mit dem Argument 5 auf)



  • *Vor den Kopf schlag*


Anmelden zum Antworten