2014-05-10 4 views
5
  1. Hier habe ich tmp nicht freigegeben, aber ptr wird explizit freigegeben. Wird tmp auch freigegeben werden, da sich ptr und tmp auf den gleichen Ort beziehen?Wird dies zu einem Speicherverlust in C++ führen?

  2. Wenn nicht dann was passiert mit dem Zeiger tmp? Führt es zu einem Speicherleck?

+1

Es verursacht kein Leck. Der Zeiger 'tmp' selbst ist eine Stapelvariable, also verwendet er keinen Speicher, wenn 'alloc()' zurückkommt. –

+0

Wie ist tmp eine Stapelvariable, wenn sie einen neuen Operator verwendet? – kishore

+1

@kishore: 'ptr' hält nur eine Adresse. Diese Adresse ist auf dem Stapel gespeichert. Was es an _ (die Ressource) zeigt, ist woanders, und das müssen Sie freigeben (die Ressource, nicht der Zeiger). 'delete prt;' tut eigentlich nichts zu 'ptr'. Nur zu dem, worauf es hinweist. – Mat

Antwort

5

Nein, dies führt nicht zu einem Speicherverlust. Speicherlecks sind Puffer (Speicherblöcke), die zugewiesen, aber nicht zurückgegeben wurden (wenn sie nicht mehr verwendet werden). In Ihrer alloc() Funktion ist tmp kein Puffer ... es ist eine Variable, die nach dem Aufruf an new die Adresse eines Puffers enthält. Ihre Funktion gibt diese Adresse zurück, die unter main() in der Variablen ptr gespeichert wird. Wenn Sie später delete ptr aufrufen, geben Sie den Puffer frei, der ptr Punkte anzeigt, somit wurde der Puffer freigegeben und es gibt kein Leck.

+0

Was passiert, wenn ich mehrere RAW-Zeiger auf den gleichen Speicherort habe und einen dieser Zeiger frei habe? Ist die Erinnerung dann frei? – kishore

+0

@kishore Ja, Sie müssen Ihren Puffer genau einmal freigeben, und es spielt keine Rolle, wie viele Stellen (Zeiger) Sie eine Kopie der Adresse des Puffers haben. – mah

3

Ihr Programm keinen Speicher verursacht Leck sofern nicht abgefangene Ausnahmen geworfen werden.

Sie können es besser machen und es zu 100% bombensicher wie diese machen:

#include <memory> 

std::unique_ptr<int> alloc() 
{ 
    std::unique_ptr<int> tmp { new int }; 
    //... anything else you might want to do that might throw exceptions 
    return tmp; 
} 

int main() 
{ 
    std::unique_ptr<int> ptr = alloc(); 

    // other stuff that may or may not throw exceptions 

    // even this will fail to cause a memory leak. 
    alloc(); 
    alloc(); 
    alloc(); 

    auto another = alloc(); 

    // note that delete is unnecessary because of the wonderful magic of RAII 
    return 0; 
} 

früh in diese Gewohnheit.

Verwandte Themen