Czy używasz inteligentnych wskaźników, takich jak Boost shared_ptr
? Jeśli tak, sprawdź, czy w dowolnym miejscu bezpośrednio używasz surowego wskaźnika, wywołując get()
. Uważam, że jest to dość powszechny problem.
Na przykład wyobraź sobie scenariusz, w którym surowy wskaźnik jest przekazywany (na przykład jako funkcja obsługi wywołania zwrotnego) do twojego kodu. Możesz zdecydować się przypisać to do inteligentnego wskaźnika, aby poradzić sobie z liczeniem referencji itp. Duży błąd: Twój kod nie jest właścicielem tego wskaźnika, chyba że wykonasz głęboką kopię. Kiedy twój kod zostanie wykonany za pomocą inteligentnego wskaźnika, zniszczy go i spróbuje zniszczyć pamięć, na którą wskazuje, ponieważ uważa, że nikt inny go nie potrzebuje, ale kod wywołujący spróbuje go usunąć, a otrzymasz podwójną wolny problem.
Oczywiście może to nie być twój problem. Najprościej jest to przykład, który pokazuje, jak to się może stać. Pierwsze usunięcie jest w porządku, ale kompilator wyczuwa, że usunął już tę pamięć i powoduje problem. Dlatego przypisanie 0 do wskaźnika bezpośrednio po usunięciu jest dobrym pomysłem.
int main(int argc, char* argv[])
{
char* ptr = new char[20];
delete[] ptr;
ptr = 0;
delete[] ptr;
}
Edycja: zmieniono delete
na delete[]
, ponieważ ptr jest tablicą znaków.
NULL
wskaźniki (co maskuje błędy, które w przeciwnym razie zostałyby wyłapane, jak ładnie pokazuje to pytanie), ale nikt nie sugeruje, aby w ogóle nie robić ręcznego zarządzania pamięcią, co jest bardzo możliwe w C ++. Nie pisałemdelete
od lat. (I tak, mój kod jest krytyczny dla wydajności. W przeciwnym razie nie zostałby napisany w C ++.)