In C # und Java verwenden Sie new, um eine Instanz einer Klasse zu erstellen, und müssen sich dann nicht mehr darum kümmern, sie später zu zerstören.
C ++ hat auch ein Schlüsselwort "new", das ein Objekt erstellt. Im Gegensatz zu Java oder C # ist dies jedoch nicht die einzige Möglichkeit, ein Objekt zu erstellen.
C ++ verfügt über zwei Mechanismen zum Erstellen eines Objekts:
Bei der automatischen Erstellung erstellen Sie das Objekt in einer Umgebung mit Gültigkeitsbereich: - in einer Funktion oder - als Mitglied einer Klasse (oder Struktur).
In einer Funktion würden Sie es folgendermaßen erstellen:
int func()
{
A a;
B b( 1, 2 );
}
Innerhalb einer Klasse würden Sie es normalerweise so erstellen:
class A
{
B b;
public:
A();
};
A::A() :
b( 1, 2 )
{
}
Im ersten Fall werden die Objekte beim Verlassen des Bereichsblocks automatisch zerstört. Dies kann eine Funktion oder ein Scope-Block innerhalb einer Funktion sein.
Im letzteren Fall wird das Objekt b zusammen mit der Instanz von A zerstört, in der es Mitglied ist.
Objekte werden mit new zugewiesen, wenn Sie die Lebensdauer des Objekts steuern müssen. Anschließend muss es gelöscht werden, um es zu zerstören. Mit der als RAII bekannten Technik kümmern Sie sich um das Löschen des Objekts an dem Punkt, an dem Sie es erstellen, indem Sie es in ein automatisches Objekt einfügen, und warten, bis der Destruktor des automatischen Objekts wirksam wird.
Ein solches Objekt ist ein shared_ptr, das eine "Löscher" -Logik aufruft, jedoch nur dann, wenn alle Instanzen des shared_ptr, die das Objekt gemeinsam nutzen, zerstört werden.
Während Ihr Code möglicherweise viele Aufrufe von new enthält, sollten Sie im Allgemeinen nur begrenzte Aufrufe zum Löschen haben und immer sicherstellen, dass diese von Destruktoren aufgerufen oder Objekte "gelöscht" werden, die in Smart-Pointer eingefügt werden.
Ihre Destruktoren sollten auch niemals Ausnahmen auslösen.
Wenn Sie dies tun, treten nur wenige Speicherlecks auf.