[解決済み] ポインタを削除した後、NULLにするのは良い習慣ですか?
2022-04-24 12:24:46
質問
まず最初に言っておきます。 スマートポインターを使えば、このような心配は無用です。
次のコードの問題点は何ですか?
Foo * p = new Foo;
// (use p)
delete p;
p = NULL;
に端を発したものです。 回答・コメント という質問がありました。からの1件のコメント ニール・バタワース アップヴォート
<ブロッククオートC++では、削除後にポインタをNULLに設定することは、普遍的なグッドプラクティスではありません。それが良いことである場合もあれば、無意味であり、エラーを隠してしまう場合もあるのです。
それが役に立たない状況もたくさんあります。しかし、私の経験では、損をすることはない。誰か教えてください。
どのように解決するのですか?
ポインタを0(標準C++では"null"、CのNULL定義は多少異なる)に設定すると、二重削除によるクラッシュを回避できます。
次のように考えてみましょう。
Foo* foo = 0; // Sets the pointer to 0 (C++ NULL)
delete foo; // Won't do anything
ところがだ。
Foo* foo = new Foo();
delete foo; // Deletes the object
delete foo; // Undefined behavior
つまり、削除されたポインタを0にしないと、二重削除をした場合にトラブルが発生するのです。削除後のポインタを0にすることに反対する論拠は、そうすることで二重削除のバグを覆い隠し、処理されないままにしておくということでしょう。
もちろん、二重削除のバグがないのが一番ですが、所有権のセマンティクスやオブジェクトのライフサイクルによっては、実際に実現するのは難しいかもしれません。私は、UBよりもマスクされたダブルデリートバグを好みます。
最後に、オブジェクトの割り当て管理に関する補足ですが、以下のサイトを参考にしてください。
std::unique_ptr
は、厳密な所有権/特異な所有権に対応します。
std::shared_ptr
を使用するか、あるいは他のスマートポインタの実装を使用するか、ニーズに応じて選択します。
関連
-
[解決済み】 unsigned int vs. size_t
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] 変数が「未定義」または「NULL」であるかどうかを判断するにはどうすればよいですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] instanceofを呼び出す前にnullチェックは必要ですか?
-
[解決済み] Pythonでnullオブジェクトを参照する
-
[解決済み] カラムの変更:NULLをNOT NULLに変更する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】Cygwin Make bash コマンドが見つかりません。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】C++ - ステートメントがオーバーロードされた関数のアドレスを解決できない。
-
[解決済み】Enterキーを押して続行する
-
[解決済み] 1行のifやループに中括弧(={})を使用する目的は何ですか?