はい。
それができる唯一の「害」は、プログラムに非効率性 (不要なストア操作) を導入することですが、ほとんどの場合、メモリ ブロックの割り当てと解放のコストに比べれば、このオーバーヘッドは取るに足らないものです。
そうしないと、ある日、厄介なポインター逆参照バグが発生することになります。
削除には常にマクロを使用します。
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(配列の場合も同様で、free()、ハンドルの解放)
呼び出し元コードのポインターへの参照を取得する「自己削除」メソッドを作成して、呼び出し元コードのポインターを強制的に NULL にすることもできます。たとえば、多くのオブジェクトのサブツリーを削除するには:
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;
}
編集
はい、これらの手法はマクロの使用に関するいくつかのルールに違反しています (そして、最近では、おそらくテンプレートを使用して同じ結果を達成することができます)。直面する可能性のある問題をデバッグするのに最も時間がかかります。実際には、長年にわたって、私が導入したすべてのチームから、非常に大きなバグを効果的に排除してきました。
上記を実装する方法もたくさんあります。呼び出し元のポインターを NULL しないメモリを解放する手段を提供するのではなく、オブジェクトを削除した場合にポインターを強制的に NULL にするという考えを説明しようとしています。 .
もちろん、上記の例は自動ポインタへの一歩にすぎません。OPが自動ポインターを使用しない場合について具体的に尋ねていたので、私は提案しませんでした。