はい。
それができる唯一の「害」は、プログラムに非効率性(不必要なストア操作)を導入することです-しかし、このオーバーヘッドは、ほとんどの場合、メモリブロックの割り当てと解放のコストとの関係では重要ではありません。
あなたがそれをしない場合は、します一日いくつかの厄介なポインタderefernceのバグを持っています。
削除には常にマクロを使用します。
#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;
}
編集する
はい、これらのテクニックはマクロの使用に関するいくつかのルールに違反します(そして、はい、最近ではおそらくテンプレートで同じ結果を得ることができます)-しかし、何年にもわたって私がデッドメモリにアクセスしたことはありません -最も厄介で最も難しいものの1つ直面する可能性のある問題のデバッグに最も時間がかかる。実際、長年にわたって、私が導入したすべてのチームから、whjoleクラスのバグを効果的に排除してきました。
上記を実装する方法はたくさんあります。私は、呼び出し側のポインターをNULLにしないメモリを解放する手段を提供するのではなく、オブジェクトを削除した場合に、ユーザーにポインターをNULLにするように強制するというアイデアを説明しようとしています。 。
もちろん、上記の例は自動ポインタへのステップにすぎません。これは、OPが自動ポインターを使用しない場合について具体的に要求していたため、提案しませんでした。
delete
ただし、nullポインターを使用しても安全です。これは、ポインターをゼロにすることが有効な理由の1つです。