そのため、今日、コンストラクターの引数リストにNULLが渡され、アプリケーションが破損するというバグに遭遇しました。コンパイラがこれを禁止しなかったのは奇妙なことです。引数リストが変わったので、今まで気づかなかった。次のコードスニペットを参照してください。
このオブジェクトは3つのパラメーターを取ります。std::string&に細心の注意を払ってください。
class Foo {
public:
std::string myName;
unsigned int someVariable;
void * ptr;
Foo(const std::string& name, void * aPtr, unsigned int variable);
~Foo();
}
Foo::Foo(const std::string& name, void * aPtr, unsigned int variable) : myName(name), ptr(aPtr), someVariable(variable)
{
// object constructed
}
int main(int argc, char* argv[])
{
// construct an instance of Foo
Foo foo(NULL /*whoops, passed in NULL when a string should be passed in*/,
"foo",
0); // program compiles as expected, A NULL pointer runtime error occurs when executed.
}
したがって、基本的に、fooオブジェクトの入力値を誤って切り替えた場合、コンパイラは何もしません。アラームは鳴らず、プログラムがクラッシュしたときに何が起こったのか頭を悩ませたままになります。これを防ぐ方法があるはずだと思います。この問題を回避する何かがありますか?コンパイラにオンにする必要があるものはありますか?