Evet.
Yapabileceği tek "zarar", programınıza verimsizlik (gereksiz bir depolama işlemi) sokmaktır - ancak bu ek yük, çoğu durumda bellek bloğunu ayırma ve serbest bırakma maliyetiyle ilişkili olarak önemsiz olacaktır.
Bunu yapmazsanız, bir gün bazı kötü işaretçi derefernce hatalarınız olacak .
Her zaman silmek için bir makro kullanırım:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(ve bir dizi için benzer, free (), tutamaçları serbest bırakarak)
Ayrıca, çağıran kodun işaretçisini çağıran kodun işaretçisini NULL'a zorlayacak şekilde, çağıran kodun işaretçisine referans alan "kendi kendini silme" yöntemleri de yazabilirsiniz. Örneğin, birçok nesneden oluşan bir alt ağacı silmek için:
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;
}
Düzenle
Evet, bu teknikler makro kullanımıyla ilgili bazı kuralları ihlal ediyor (ve evet, bugünlerde muhtemelen aynı sonucu şablonlarla elde edebilirsiniz) - ancak yıllar boyunca hiç ölü belleğe erişmedim - en kötü ve en zor olanlardan biri ve karşılaşabileceğiniz sorunları ayıklamak en çok zaman alır. Yıllar boyunca pratikte, onları tanıttığım her takımdaki bütün bir hata sınıfını etkili bir şekilde ortadan kaldırdılar.
Yukarıdakileri uygulayabileceğiniz birçok yol vardır - sadece, arayanın işaretçisini BOŞLUK olmayan belleği serbest bırakmaları için bir yol sağlamak yerine, insanları bir nesneyi sildiklerinde bir işaretçiyi NULL yapmaya zorlama fikrini göstermeye çalışıyorum. .
Tabii ki, yukarıdaki örnek bir otomatik işaretleyiciye doğru bir adımdır. Bunu önermedim çünkü OP özellikle bir otomatik işaretçi kullanmama durumunu soruyordu.
delete
Boş gösterici için güvenlidir , bu da bir işaretçiyi sıfırlamanın iyi olmasının bir nedenidir.