Die Meisten Common Memory/Resource Leak Fehler
Alles gute C++ - Programmierer wissen, wie die zu vermeiden undicht Speicher (oder Resourcen wie sockets):
- Immer den Einsatz von smart-Pointern, die ich. e.:
std::auto_ptr
,boost::shared_ptr
. - Immer bewusst sein, das Eigentum des Objektes: wer besitzt, der sich, wer ist verantwortlich etc.
Aber, Speicherlecks noch passieren. Punkt die meisten common Fragen, wenn Sie entdeckt haben
ein Speicherverlust in einer Anwendung, selbst wenn Sie die oben genannten Techniken.
Ich starten:
Manchmal vergessen Sie zu definieren der Destruktor der Basisklasse als virtuell. Also alle abgeleiteten Klassen, bezeichnet durch Zeiger auf die Basisklasse, die nicht zerstört wurde, richtig und deshalb ausgetreten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es viele weitere Arten von Fehlern als nur Lecks. In der Reihenfolge vom schlechtesten zum besten:
Speicher Korruption.
Daten gespeichert ist, auf ein Gebiet, wo es nicht sollte. Dies führt sowohl die Mehrheit der Sicherheitsprobleme und ist bei weitem der schwierigste, auf die Spur.
X
gespeichert ist, auf ein array-element reserviert für eine base typeX
, und die Größe derX
größer ist als die Größe Ihrer Basis.new
/free
,malloc
/delete
)delete
oderfree
genannt wird, zweimal auf den gleichen Zeiger.Scheitern, um Speicher freizugeben
Speicher nicht mehr verwendet werden, das Programm bleibt reserviert.
new[]
/delete
stattnew[]
/delete[]
.smart_ptr
verwendet wird, in einer kreisförmigen Struktur der Daten, ohne Aufmerksamkeit auf die Verwendung vonweak_ptr
für die kreisrunde link.Zirkuläre Referenzen sind Häufig, und Sie sind nicht gelöst, indem
std::auto_ptr
oderboost::shared_ptr
Es gibt keinen Ersatz für (2) auf Ihrer Liste, die verwenden Ihr Gehirn.
Einen Fehler gemacht, indem Sie Menschen allzu vertraut mit automatischer garbage collection (durch smartpointers):
Vielleicht, ich bin aus dem Rahmen, aber ich hatte einige merkwürdige Fehler versuchen zu "löschen" nicht initialisierte Zeiger.
Zu "vermeiden" Speicherlecks, ich benutze die
try {} __finally {}
Struktur umgesetzt werden, wenn (aber ich habe irgendwo gelesen, es kann ineffizient sein, wenn eine Ausnahme angehoben wurde in eine sub-sub-call)C++
, es ist nur microsoft-ext.., die Sie verwenden solltenstd::auto_ptr
dass zerstört zu widersprechen, wenn Sie den Bereich verlassen. Eigentlich ist C++ muss nicht endlich, denn es hat deterministischen Destruktoren.