2016-04-24 222 views
3

我不明白爲什麼我沒有得到一個警告(使用g ++或鐺++)在下面newtstr()返回NULL作爲對象沒有得到任何警告。NULL返回時爲對象

$ g++ -Wall -Wextra -pedantic testptr.cpp 
$ 

我做的,但是,得到一個運行時錯誤:

$ ./a.out 
terminate called after throwing an instance of 'std::logic_error' 
    what(): basic_string::_S_construct null not valid 
Aborted 
$ 

$ g++ --version 
g++ (GCC) 4.8.0 
+0

你已經標記了這個鏗鏘聲++。這是否也適用於鏗鏘聲? –

+1

你爲什麼期待警告?這是一個有效的構造。 – ZDF

+0

@ZDF OP或者不知道隱式的'const char *'強制轉換,或者他期望他的編譯器看到「嘿,這是一個靜態表達式,它給了我一個零指針,'string'ctor試圖做的東西,它應該能夠警告我這件事!「 –

回答

7

std::string具有constructorbasic_string(const CharT* s, const Allocator& alloc = Allocator());它接受一個const char*指針用於構造一個新的字符串(參見(5))。行return NULL;導致隱式調用該構造函數與NULL指針作爲參數 - 這是有效的代碼,但顯然將無法正常運行。

+0

啊 - 謝謝!我認爲這屬於「有很多烘焙到C++標準庫」類別... –

+0

不是真的,@ChrisGregg。想象一個沒有方法從C風格的字符串(它是一個'const char'數組,它對所有方法調用本質上轉換爲'const char *')構造'std :: string'的方法 - d很難在你的代碼中指定字符串,因爲你的普通''text''字符串就是--C風格的字符串。 –