-1

メンバーへのポインター演算子 (->*) を使用する場合、未定義の動作を引き起こすオブジェクトのポインター値はどれですか?

具体的には、問題のメンバー関数がメンバーにアクセスせず、仮想でない場合、次のいずれかが悪いですか?

  • ヌル ポインター
  • すでに削除されたオブジェクトへのポインタ

この質問は似ていますが、通常のメンバー関数呼び出しについて説明しています。

コードで説明するには:

#include <iostream>     
using namespace std;     

class Foo {     
public:     
  int member(int a)     
  {     
    return a+1;     
  }     
};     

typedef int (Foo::*FooMemFn)(int);     

int main(int argc, char** argv)     
{     
  FooMemFn funcPtr = &Foo::member;     
  Foo *fStar = 0;     
  Foo *fStar2 = new Foo();     
  delete fStar2;     

  int a1 = (fStar->*funcPtr)(4);  //does this invoke UB?                                                                                                                                                                                                                             
  int a2 = (fStar2->*funcPtr)(5); //what about this?                                                                                                                                                                                                                               

  cout<<"a1: "<<a1<<"  a2: "<<a2<<endl;     

  return 0;     
}

未定義の動作に関する質問は C++ 標準に関する質問であるため、C++ 標準のセクションへの具体的な参照を探しています。

4

1 に答える 1

1
int a1 = (fStar->*funcPtr)(4);  //does this invoke UB?  
int a2 = (fStar2->*funcPtr)(5); //what about this? 

はい。どちらのステートメントもUBを呼び出します。
それらは以下と同等であるため:

fStar->member(4);
fStar2->member(5);

それぞれ。

于 2012-07-18T03:08:13.437 に答える