0

特定のポインター アドレスを に出力するとstd::cout、クラッシュが発生します。

bool MyClass::foo() const
{
  std::cout << "this prints fine" << std::endl << std::flush;
  std::cout << d << std::endl << std::flush;  // crash!
  return true;
}

はクラスのポインタメンバdです。つまり、次のとおりです。

class MyClass {
// ... 
 private:
  MyClassPrivate* d;
};

アプリケーションがクラッシュする原因は何ですか? NULL ポインターまたは初期化されたポインターであっても、(おそらく無効な) アドレスを出力する必要がありますよね?

違いが生じる場合、アプリケーションはデバッグ モードでコンパイルされます。関数fooはインラインとしてマークされていません。

背景: 外部アプリケーション プロセスのバグを追跡しようとしています。このバグは、別のアプリケーションが連射コマンドをプロセスに送信した場合にのみ発生します。std::cout外部プロセスの実行を追跡するために使用しています。

4

2 に答える 2

4

thisが有効なポインターでない場合、メンバー フィールドへのアクセスによってアクセス違反が発生する可能性があります。無効なポインターで呼び出された非仮想メソッドは、フィールドにアクセスしようとするまで問題なく機能します。これは、呼び出し自体が逆参照する必要がないためthisです。

たとえば、この状況は、次のように大まかにクラッシュします。

MyClass* instance = nullptr; // or NULL if you're not using C++11
instance->foo(); // will crash when `foo` tries to access `this->d`
于 2012-05-10T17:49:57.113 に答える
3

operator<<(ostream &, MyClassPrivate*)ポインターを逆参照する のオーバーロードが存在する可能性があります。たとえば if MyClassPrivateis really は確かにありますchar

試してみてstd::cout << (void*)d;、違いがあるかどうかを確認してください。そうでない場合、zneakの答えはもっともらしいようです。

于 2012-05-10T17:50:44.757 に答える