標籤:

C++中String問題?

String對象中不含任何元素,正如size函數返回的數據那樣string s1中的對象為0,那麼為什麼s1[0]為a呢?我懷疑過可能是偶然性,但嘗試了不下10次都是相同的結果,希望大神能詳細解釋下


因為string::operator[]如果offset大於長度是未定義操作

Exception safety

If pos is not greater than the string length, the function never throws exceptions (no-throw guarantee).

Otherwise, it causes undefined behavior.


試一下 s1.at(0),你就正好有個實例了解 [n] 和 at(n) 的區別,以及你這個問題的答案。


得看 capacity。另不允許有大小為 0 的 new。至少會被弄成 1


越界了。

至於越界後為什麼總是a,不用管它,這個純粹是未定義行為,是什麼都有可能。

實際編程中,你永遠不可能用到這個「特性」。


大家沒發現嗎?題主問的是為什麼偏偏是a


你用的是VC吧,他的std::string實現是採用了短字元串優化(SSO)技巧,哪怕一個空的std::string對象,其內部也有一個16位元組的緩衝區,我沒記錯的話release下的sizeof(std::string)是28個位元組,雖然s1是空串,但是緩衝區是占著內存的,所以你取s1[0]沒有ACCESS VIOLATION。

具體細節參考陳碩的這篇文章C++ 工程實踐(10):再探std::string

話說你應該跑的是Release版本吧,Debug版本按理說會檢查iterator的合法範圍的,如下:

_DEBUG_ERROR("string subscript out of range");


為啥你不直接using namespace std;


把string看成指針。。



推薦閱讀:

請問我該注重學習Linux哪個方面?
python調用CC++的方法各有什麼優勢,哪個最好?
我寫C++喜歡用繼承有問題么?
github 上有哪些遊戲或者遊戲開發相關的炫酷的user或者repo?
noexcept標識符為什麼不這樣設計?

TAG:C | CC | CPrimer | string |