ポインタに関する小さな問題が発生しました。 私は1行でこのタスクを実行するために迅速かつ簡単な方法を持っていると思ったよう:ポインタを削除してリセットするためのC++テンプレート関数
...
delete pointer;
pointer = 0;
...
私はすぐにポインタのいずれかのタイプを受け入れるテンプレートメソッドを持つ単純なヘッダファイルを設定します。これは次のようになります:
#ifndef P_DELETE_H
#define P_DELETE_H
template <typename T>
void pDelete(T* pointer) {
if (pointer) {
delete pointer;
pointer = 0;
}
}
#endif
しかし、結果は、オブジェクトbeeingが削除され、ポインタbeeingリセットの私の期待を満たしていません。代わりに、オブジェクトだけが削除されたようですが、ゼロに設定しても何の効果もありませんでした。誰かがここで私を少し明るくしてこの行動を説明できたら、私はそれほど気にしません!
UPDATE:
答えがのstd :: unique_ptrをとstdを使用して、説明したよう:: shared_ptrのは、このポインタをより無効化して行くための安全な方法です。
しかし、あなたは本当に私が要求されるような道を行く必要がある場合は、次のコードは、トリックを行います:
template <typename T>
inline void pDelete(T*& pointer) {
if (pointer) {
delete pointer;
pointer = 0;
}
}
しかし、これは正しく削除し、ポインタを無効にもかかわらず、使用することが一般的に安全ではありませんすべてのインスタンスで(クイックテストはこれを明らかにした)。
有益な回答をいただき、ありがとうございます。あなたが探している
関数引数は、関数スコープに対してローカルです。これにはポインタが含まれます。関数外の値に影響を与えるには、ポインタ参照またはポインタポインタを使用する必要があります。 – Biffen
参照パラメータが必要です: 'void pDelete(T *&pointer)' –
*参考文献*と引数の受け渡し方法について知っていますか? *参照によって*? –