以下代碼讀取包含某個值的文件,該值代表更多後續數據的長度。std :: iostream使用計數零和無效緩衝區讀取或寫入
auto file = std::ifstream(filename, std::ios::in | std::ios::binary);
// dataLen = Read some header field containing a length of following data.
std::vector<unsigned char> data;
data.resize(dataLen);
file.read((char*)data.data(), dataLen);
如果使用了dataLen = 0
,則MSVC 2013編譯器失敗。它導致消息Expression: invalid null pointer
中止,因爲data.data()
返回空指針。
This question表明0的count
對std::basic_istream::read
有效,但對問題的第三個評論似乎指出了我的問題。
是否有效C++將大小爲0的無效指針傳遞給std::basic_istream::read
(或std::basic_ostream::write
)?對我來說這似乎合乎邏輯,因爲呼叫不應觸碰緩衝區。
顯而易見的解決方案是用if子句處理這個特殊情況,但我想知道MSVC是否再次出錯。
這裏是正在運行的程序罰款鏗鏘的編譯例子:http://coliru.stacked-crooked.com/a/c036ec31abd80f22
爲了澄清,「這會導致與消息中止......」 - 是由一個未捕獲的異常* *觸發?或者它是VS標準C++庫的調試二進制文件中的runtime * assertion *。這似乎沒有什麼大的差別,但它是相關的。並且在*發佈*版本中後面的行爲是否相同? – WhozCraig
@WhozCraig它說'Debug Assertion Failed!'並且在發佈版本中不會發生。 – typ1232
@ typ1232那麼,爲什麼不在調試模式下只是做'data.resize(dataLen + 1)'? – Barry