[解決済み] ポインタの有効性のテスト(C/C++)
質問
与えられたポインタが "valid"であるかどうかを (もちろん、プログラム的に) 判断する方法はあるでしょうか? NULL をチェックするのは簡単ですが、0x00001234 のようなものについてはどうでしょうか? この種のポインタをデリファレンスしようとすると、例外やクラッシュが発生します。
クロスプラットフォームな方法が望ましいですが、プラットフォーム固有(WindowsとLinux用)でも大丈夫です。
明確化のための更新です。 問題はstale/freed/uninitializedポインタではなく、呼び出し元からポインタ(文字列へのポインタ、ファイルハンドルなど)を取得するAPIを実装しています。呼び出し元は、(意図的または誤って)無効な値をポインタとして送信することができます。クラッシュを防ぐにはどうしたらよいでしょうか?
どのように解決するのですか?
<ブロッククオート明確化のための更新です。 問題は、古くなった、解放された、あるいは初期化されていないポインタではなく、呼び出し元からポインタ(文字列へのポインタ、ファイルハンドルなど)を取得するAPIを実装しています。呼び出し元は、(意図的または誤って)無効な値をポインタとして送信することができます。クラッシュを防ぐにはどうしたらよいでしょうか?
そのようなチェックを行うことはできません。ポインタが有効であるかどうかをチェックする方法はありません。人々がポインターを取る関数を使用するとき、その人々は彼らが何をしているかを知っていると信じなければなりません。もしポインタの値として0x4211を渡されたら、それがアドレス0x4211を指していると信じなければなりません。そして、もし彼らが誤ってオブジェクトをヒットしてしまったら、たとえあなたが何か恐ろしいオペレーション システム関数 (IsValidPtr やその他) を使用したとしても、あなたはまだバグに陥ってしまい、すぐに失敗することはないでしょう。
この種のことを知らせるためにヌルポインタを使い始め、ライブラリのユーザーに、誤って無効なポインタを渡しがちな場合はポインタを使うなと伝えましょう、マジで :)
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み】高放射能環境下で使用するアプリケーションのコンパイルについて
-
[解決済み】C言語の関数ポインタはどのように機能するのですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】クラスのコンストラクタへの未定義参照、.cppファイルの修正も含む
-
[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる
-
[解決済み】変数やフィールドがvoid宣言されている
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない