メンバーへのポインター演算子 (->*) を使用する場合、未定義の動作を引き起こすオブジェクトのポインター値はどれですか?
具体的には、問題のメンバー関数がメンバーにアクセスせず、仮想でない場合、次のいずれかが悪いですか?
- ヌル ポインター
- すでに削除されたオブジェクトへのポインタ
この質問は似ていますが、通常のメンバー関数呼び出しについて説明しています。
コードで説明するには:
#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++ 標準のセクションへの具体的な参照を探しています。