さまざまなプラットフォームで G++ (4.5.2) を使用すると、非常に奇妙な動作に遭遇しました。コードは次のとおりです。
class Class
{
private:
std::string rString;
public:
Class()
{
this->rString = "random string";
std::cout << "Constructor of Class" << std::endl;
}
virtual ~Class()
{
std::cout << "Destructor of Class" << std::endl;
}
void say() const
{
std::cout << "Just saying ..." << std::endl;
if (this == NULL)
std::cout << "Man that's really bad" << std::endl;
}
void hello() const
{
std::cout << "Hello " << this->rString << std::endl;
}
};
int main()
{
Class *c = NULL;
/* Dereferencing a NULL pointer results
in a successful call to the non-static method say()
without constructing Class */
(*c).say(); // or c->say()
/* Dereferencing a NULL pointer and accessing a random
memory area results in a successful call to say()
as well */
c[42000].say();
/* Dereferencing a NULL pointer and accessing a
method which needs explicit construction of Class
results in a Segmentation fault */
c->hello();
return (0);
}
問題は、メイン関数の最初の 2 つのステートメントがプログラムをクラッシュさせないのはなぜですか? これは未定義の動作ですか、それともメソッド内で「this」ポインターを逆参照しないため、コンパイラーは Class::say() を静的であるかのように呼び出しているだけですか?