メンバー関数で良いアイデアかどうか疑問に思っていたのですが、 の値にオフセットが追加されているassert( this != nullptr );
と機能しないと誰かが指摘しました。this
その場合、0 ではなく 40 のようになり、アサートが役に立たなくなります。
これはいつ起こりますか?
これが発生する可能性のある状況は次のとおりです。
struct A {
void f()
{
// this assert will probably not fail
assert(this!=nullptr);
}
};
struct B {
A a1;
A a2;
};
static void g(B *bp)
{
bp->a2.f(); // undefined behavior at this point, but many compilers will
// treat bp as a pointer to address zero and add sizeof(A) to
// the address and pass it as the this pointer to A::f().
}
int main(int,char**)
{
g(nullptr); // oops passed null!
}
これは一般に C++ では未定義の動作ですが、一部のコンパイラでは、this
ポインタがゼロ以外の小さなアドレスを持つという一貫した動作をする場合がありますA::f()
。
アサートするのはそれほど悪い考えではないと思います。たとえば、少なくとも次の例を参照してください。
class Test{
public:
void DoSomething() {
std::cout << "Hello";
}
};
int main(int argc , char argv[]) {
Test* nullptr = 0;
nullptr->DoSomething();
}
上記の例はエラーなしで実行されます。より複雑な場合、そのアサートが存在しない場合にデバッグが困難になります。
null このポインターは見過ごされる可能性があり、複雑な状況ではデバッグが困難になることを指摘しようとしています。私はこの状況に直面しました。