2010-11-18 4 views
0

sagen, dass ich etwas tun, wie diesErstellen neues Zeigerobjekt in Schleife

for(int i = 0; i < 10; i++) 
{ 
    //create a pointer object using new 
    //use the object 
} 

Muß ich das Zeigerobjekt löschen, nachdem es in der Schleife verwenden? Ich dachte wie, wenn ich es nicht löschte, wird es ein neues Objekt für 10 Mal erstellen und das Objekt einfach hängen Sie danach, Essen Ressourcen.

Antwort

4

Ja.

Sie müssen etwas löschen, das Sie neu erstellt haben, wenn Sie es nicht mehr benötigen, sonst erhalten Sie ein Speicherleck.

0

Wenn Sie so geneigt waren, könnten Sie einen Smart Pointer verwenden (so etwas wie Boosts shared_pointer) und dann, sobald der Zeiger zum letzten Mal aus dem Gültigkeitsbereich ging, würde das Objekt automatisch gelöscht werden.

0

Ja, Sie müssen es löschen. Aber eine neue Schleife zu löschen oder jede Schleife zu löschen, ist vielleicht nicht die beste Option - Sie müssen mehr Kontext bereitstellen, um bessere Ratschläge zu erhalten.

1

Ja, technisch müssen Sie sie löschen.

Aber. Wir haben dieses erstaunliche Ding, das intelligente Zeiger genannt wird, die das automatisch magisch machen.

for(int i = 0; i < 10; i++) 
{ 
    std::auto_ptr<int> x(new int(10)); 

    // automatically deleted after each iteration. 
} 
+0

Ich denke nicht, dass Deklaration wird kompilieren. Sie müssen 'auto_ptr <> x (neuer int)' –

+1

@FredOverflow, Sie sind in diesem Fall [email protected] weist dynamisch ein einzelnes int zu und initialisiert es auf 10, ohne ein Array von 10 ints zuzuweisen. –

+0

@Nathan: In der Tat bin ich! Danke, dass du darauf hingewiesen hast, +1 für deinen Kommentar. – fredoverflow

5

Ja, für jeden new braucht es eine entsprechende delete zu sein. (. Und ein delete[] für jeden new[])

jedoch der C++ Weg wäre, dynamische Lagerung so weit wie möglich vermeiden und eher beschäftigt lokale, automatische Variablen:

for(int i = 0; i < 10; ++i) 
{ 
    some_class object; 
    //use object 
} // object gets destroyed here automatically 

Wenn Sie dieses Objekt dynamisch zuweisen müssen (was ich bezweifle, aber es gibt solche Fälle), dann verwenden Sie einen intelligenten Zeiger. Ein Smart-Pointer wird die delete für Sie, egal auszuführen, die Art und Weise Sie den Bereich verlassen es gehört zu:

for(int i = 0; i < 10; ++i) 
{ 
    smart_ptr<some_class> object(new some_class()); 
    //use object 
} // object gets destroyed here automatically 

Der aktuelle Standard kennt nur ein Smart-Pointer, genannt std::auto_ptr, was würde tun würde, was Sie in dieser brauchen Fall. Der nächste Standard wird mit mehreren weiteren, darunter ein Ersatz für std::auto_ptr, genannt std::unique_ptr, und einer mit gemeinsamen Besitz Semantik, mit dem Namen std::shared_ptr kommen. Ihr Compiler/Std-Lib könnte sie tatsächlich bereits unterstützen. Wenn nicht, können Sie sie unter den vielen großen Bibliotheken finden, die bei boost gefunden werden.


BTW, beachten Sie, dass ich Ihre i++ mit ++i ersetzt haben. Im Falle eines int macht dies keinen Unterschied in Ihrem Szenario, aber es gibt Typen, für die i++ eine unnötige Kopie erstellen könnte. (Wenn Effizienz Sie nicht interessieren würde, warum Programm in C++?)