Tak.
Jedyną „szkodą”, jaką może wyrządzić, jest wprowadzenie do programu nieefektywności (niepotrzebnej operacji przechowywania) - ale ten narzut będzie w większości przypadków nieistotny w stosunku do kosztu alokowania i zwalniania bloku pamięci.
Jeśli tego nie zrobisz, zrobisz to pewnego dnia miał kilka nieprzyjemnych błędów derefernce wskaźnikowych.
Zawsze używam makra do usuwania:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(i podobnie dla tablicy, free (), zwalnianie uchwytów)
Można także napisać metody „usuwania własnego”, które pobierają odniesienie do wskaźnika kodu wywołującego, więc wymuszają na wskaźniku kodu wywołującego wartość NULL. Na przykład, aby usunąć poddrzewo wielu obiektów:
static void TreeItem::DeleteSubtree(TreeItem *&rootObject)
{
if (rootObject == NULL)
return;
rootObject->UnlinkFromParent();
for (int i = 0; i < numChildren)
DeleteSubtree(rootObject->child[i]);
delete rootObject;
rootObject = NULL;
}
edytować
Tak, te techniki naruszają niektóre zasady dotyczące używania makr (i tak, w dzisiejszych czasach prawdopodobnie można osiągnąć ten sam rezultat za pomocą szablonów) - ale używając przez wiele lat nigdy nie uzyskałem dostępu do martwej pamięci - jednej z najgorszych i najtrudniejszych i debugowanie problemów, z którymi możesz się zmierzyć, zajmuje najwięcej czasu. W praktyce przez wiele lat skutecznie wyeliminowali całą klasę błędów z każdego zespołu, do którego je wprowadziłem.
Istnieje również wiele sposobów na zaimplementowanie powyższego - po prostu próbuję zilustrować ideę zmuszania ludzi do NULL wskaźnika, jeśli usuwają obiekt, zamiast zapewnić im środki do zwolnienia pamięci, która nie powoduje ZEROWANIA wskaźnika wywołującego .
Oczywiście powyższy przykład to tylko krok w kierunku automatycznego wskaźnika. Czego nie zasugerowałem, ponieważ OP specjalnie pytał o przypadek nie używania automatycznego wskaźnika.
delete
wskaźnika zerowego, co jest jednym z powodów, dla których zerowanie wskaźnika może być dobre.