所以我今天遇到了一個錯誤,其中一個NULL被傳遞給構造函數的參數列表,這導致應用程序中斷。奇怪的是,編譯器並沒有禁止這種情況發生。由於參數列表發生了變化,直到現在才發現問題。請參閱以下代碼片段:當std :: string是參數時,如何禁止在參數列表中傳遞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對象編譯器不會做任何事情。沒有警報響起,你留下了撓頭,當程序崩潰時發生了什麼。我認爲應該有辦法來防止這種情況的發生。有什麼可以解決這個問題嗎?編譯器中是否有應該打開的東西?
爲什麼它會產生未定義的行爲? – 2012-07-31 22:21:00
@LuchianGrigore:該特定'std :: string'構造函數的參數在合約中不能爲NULL。 – 2012-07-31 22:22:02
@LuchianGrigore:'std :: basic_string'的規範要求指針不爲null。 – 2012-07-31 22:23:01