Ist Löschen in einem Destruktor notwendig?

8

Ich habe den folgenden Code und ich frage mich, ob das delete b hier notwendig ist? Wird mein Betriebssystem den zugewiesenen Speicherbereich automatisch löschen?

%Vor%

Vielen Dank.

    
daisy 28.06.2011, 06:52
quelle

9 Antworten

10

Ja, Sie müssen delete jedes Objekt erstellen, das mit new erstellt wurde, das Sie besitzen . In diesem Fall sieht class A genau diese Instanz von class B aus und ist verantwortlich für den Aufruf von delete .

Es ist viel besser, einen intelligenten Zeiger zum Verwalten von class B der Instanzlebensdauer zu verwenden. Beachten Sie auch, dass Sie den Zuweisungsoperator oder den Kopierkonstruktor entweder in class A implementieren oder verbieten müssen, um ein flaches Kopieren des Objekts zu verhindern, das Ihnen große Probleme bereiten wird.

    
sharptooth 28.06.2011, 06:54
quelle
5

Wahrscheinlich wird Ihr Betriebssystem den zugewiesenen Speicher freigeben - dies geschieht jedoch, wenn Ihr Programm beendet wird. Lang laufende Programme werden auf Speicherprobleme stoßen.

Es ist immer eine gute Idee, intelligente Zeiger für dynamisch allokierte Objekte zu verwenden. Diese werden alles löschen, was Sie brauchen.

  • std :: auto_ptr
  • boost :: shared_ptr
  • boost :: scoped_ptr
duselbaer 28.06.2011 06:56
quelle
2

Wenn Sie ein neues anrufen, ist das entsprechende Löschen immer ratsam.

Soweit Betriebssystem Ihren Speicher löscht .. ja, wird es passieren, aber nur nachdem der gesamte Prozess beendet wird (d. h. Ihre Anwendung beendet). Nur dann werden alle Speicher und andere Ressourcen vom Betriebssystem wiederhergestellt.

Versuchen Sie drittens, new / delete nur bei Bedarf zu verwenden. In Ihrem Szenario könnten Sie einfach

schreiben %Vor%

Es hätte den gleichen Effekt und Sie vermeiden eine zusätzliche dynamische Speicherzuweisung.

    
DXM 28.06.2011 06:57
quelle
1

Es ist sicherlich notwendig, wie Sie es geschrieben haben. Aber selbst mit delete ist die Klasse grundlegend gebrochen, weil sie eine Ressource verwaltet, aber nicht .

Das heißt, es gibt fast sicher keinen Grund für die manuelle Speicherverwaltung - das ist selten der Fall. Wahrscheinlich sollten Sie entweder nur ein B -Objekt als Member-Variable haben oder Sie sollten einen Smart-Pointer wie QScopedPointer :

verwenden %Vor%

Sie sollten sicherstellen, dass Sie ein gutes einführendes C ++ - Buch haben , damit Sie lernen, korrekte C ++ - Programme zu schreiben.

    
James McNellis 28.06.2011 06:56
quelle
1

Es löscht den Bereich nur, wenn der Prozess endet, aber der Bereich bleibt bis dahin allzeit belegt, was Speicherverlust bedeutet .

    
Igor Oks 28.06.2011 06:57
quelle
1

Ressourcenmanagement bedeutet mehr als nur die Freigabe von Speicher. Ja, die meisten Plattformen werden jeden Speicher, den Sie zuweisen, wenn der Prozess endet, und Speicher ist billig genug, dass Sie vielleicht eine Weile nicht bemerken werden. Aber was ist mit der Datei b , die offen bleibt, oder dem Mutex, den sie in ihrem Destruktor freischalten wird? Bevor Ihnen der Speicher ausgeht, können Sie Probleme bekommen, wenn Sie Ihre Objekte über ihre Nützlichkeit hinaus leben lassen.

    
Dennis Zickefoose 28.06.2011 07:18
quelle
0

Das b -Member wird auf dem Heap zugewiesen. Es ist wahr, dass das Betriebssystem den gesamten von Heap belegten Speicher freigibt; Dies geschieht jedoch nur einmal: beim Beenden des Programms .

Wenn Sie also die zugewiesenen Heap-Blöcke nicht sofort freigeben, wenn sie unbenutzt werden (normalerweise in einem Destruktor eines Objekts), riskieren Sie, dass Sie ein Speicherleck .

Die Antwort ist im Grunde: yes , Sie müssen delete manuell aufrufen, da der Speicher nicht automatisch so schnell wie möglich freigegeben wird (obwohl Smart-Pointer Ihnen helfen werden, etwas Ähnliches zu erreichen) .

    
ulidtko 28.06.2011 06:58
quelle
0

Alles, was Sie mit new zuweisen, sollten Sie mit delete freigeben, andernfalls liegt ein Speicherleck in Ihrer Anwendung vor.

Auf den meisten modernen Betriebssystemen (die Betriebssysteme, die normalerweise auf Desktopcomputern ausgeführt werden) wird alles, was ein Prozess verwendet, bereinigt, wenn der Prozess endet. Wenn Sie also delete vergessen, wird der Speicher trotzdem freigegeben . Aber du solltest dich darauf verlassen.

Vor langer Zeit programmierte ich auf dem Amiga in C. Sein Betriebssystem war viel weniger anspruchsvoll als die heutigen Betriebssysteme. Wenn Sie Speicher reservieren und ihn nicht freigeben würden, bleibt er reserviert, bis Sie den Computer ausschalten oder neu starten, selbst nachdem der Prozess beendet wurde. Speicherlecks waren dann ein noch ernsthafteres Problem.

    
Jesper 28.06.2011 06:59
quelle
0

1) Bei lang laufenden Anwendungen treten Probleme auf, da das Betriebssystem den Speicher nur zurückfordern kann, wenn die Anwendung nicht mehr ausgeführt wird.

2) delete b; bewirkt auch, dass der Destruktor der B-Instanz, auf die gezeigt wird, ausgeführt wird. Sonst wird es nie laufen, da es keinen Weg mehr gibt, um daran zu kommen. Dieser Destruktor könnte etwas Wichtiges tun.

    
Karl Knechtel 28.06.2011 08:15
quelle

Tags und Links