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++?)
Ich denke nicht, dass Deklaration wird kompilieren. Sie müssen 'auto_ptr <> x (neuer int)' –
@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. –
@Nathan: In der Tat bin ich! Danke, dass du darauf hingewiesen hast, +1 für deinen Kommentar. – fredoverflow