C++中String問題?
01-30
String對象中不含任何元素,正如size函數返回的數據那樣string s1中的對象為0,那麼為什麼s1[0]為a呢?我懷疑過可能是偶然性,但嘗試了不下10次都是相同的結果,希望大神能詳細解釋下
因為string::operator[]如果offset大於長度是未定義操作
Exception safetyIf 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標識符為什麼不這樣設計?