2015-07-01 26 views
0

我正在研究其他人開發的C++代碼,並找到了一個部分,其中std::string被分配給一個不以NULL結尾的char數組。代碼(簡體)是這樣的:將std :: string分配給非終止字符數組時的預期行爲?

char *filePath="c:\\filename.txt"; //file known to contain 20 chars per line. 
int size=20; 
char *buffer; 
std::string bufferstr; 

buffer=new char[size]; 
std::ifstream input(filePath, std::ios::in | std::ios::binary); 
input.read(buffer,size); 
bufferstr=buffer; // Assign string to non-null-terminated char array. 

// Lots of other code omitted here. 
input.close(); 
delete[] buffer; 

我並不驚訝地發現,檢查與內存博士代碼的時候,和現在已經改變了這種所以內存的錯誤,buffer始終是空值終止,但該代碼已經有3年左右的這個錯誤,並且在我最近對代碼中一個看似不相關的部分進行了更改之前,已經按照預期行事(在Windows,Linux和Solaris上)。

我的問題是:
- 什麼是分配std::string到非空值終止char陣列時,預期的行爲?
- 爲什麼此代碼在其他地方進行更改後會開始行爲不當?

+2

那麼,未定義的行爲仍然可以_work_。 –

+0

總是置零分配內存的好理由。不要將分配的內存置零的一個很好的理由。 –

回答

0
  • 將std :: string分配給非空終止的char數組時,期望的行爲是什麼?

的std :: string將考慮了從接收到含有零值的第一地址指針,是字符串的一部分。通常,這意味着您要麼在字符串末尾獲得一些垃圾字符,要麼會得到應用程序核心轉儲,並出現「無法分配」或「訪問違規讀取」等錯誤。

  • 爲什麼在其他地方做出更改後,此代碼會開始行爲不當?

因爲其他地方的更改也更改爲零的位置,所以在非零終止緩衝區末端的存儲器中(這是一個有教養的猜測)。

1

如果char數組非空終止,則結果爲UB。可能發生的情況是字符串構造函數將超出分配的緩衝區,遲早會遇到空字節。

相關問題