Podstawowe kroki są dwojakie:
Po pierwsze, należy pamiętać, że każda nowa wymaga usunięcia. Tak więc, kiedy używasz nowego operatora, zwiększ swoją świadomość tego, co ten obiekt będzie robić, w jaki sposób będzie on używany i jak będzie zarządzany jego czas życia.
Po drugie, upewnij się, że nigdy nie zastępujesz wskaźnika. Możesz to zrobić za pomocą klasy inteligentnego wskaźnika zamiast surowych wskaźników, ale jeśli będziesz absolutnie pewien, że nigdy nie użyjesz go z niejawną konwersją. (przykład: przy użyciu biblioteki MSXML, utworzyłem inteligentny wskaźnik CCOMPtr do przechowywania węzłów, aby uzyskać węzeł, który wywołuje się metodą get_Node, przekazując adres inteligentnego wskaźnika - który miał operator konwersji, który zwrócił typ wskaźnika bazowego.) oznaczało to, że jeśli inteligentny wskaźnik już posiadał dane, dane tego członka zostałyby zastąpione, przeciekając poprzedni węzeł).
Myślę, że te 2 przypadki są czasami, kiedy możesz przeciekać pamięć. Jeśli używasz tylko inteligentnego wskaźnika bezpośrednio - nigdy nie pozwalając na ujawnienie swoich wewnętrznych danych, jesteś bezpieczny od tego ostatniego problemu. Jeśli zawiniesz cały kod, który używa nowego i usuniesz w klasie (np. Przy użyciu RAII), jesteś całkiem bezpieczny od tego pierwszego.
Unikanie wycieków pamięci w C++ jest bardzo proste, jeśli wykonasz powyższe czynności.
ostrożnie z nowym == usunąć pomysł. Załóżmy, że masz kilka miejsc, w których pamięć może zostać zwolniona, każda z kontrolą zerową, tzn. 'If (p) delete p;' Możesz skończyć z nowym == N * usuń gdzie N jest arbitralne. – ezpz
'delete 0' jest no-op, więc nie powinieneś nigdy sprawdzać, czy wskaźnik jest pusty przed usunięciem. –
Dziękuję Peter! To jest mój pee numer 1! "if (p) delete p;" należy ponownie napisać jako: "delete p; p = 0;" lub coś podobnego. – Thomi