一些你最初的陳述是不完全正確的:
對於char *
和char []
例如,在兩種情況下,變量本身,str
仍然在範圍和訪問,直到它是否在全局命名空間被聲明的程序結束。
如果它在函數或方法的作用域中聲明,那麼在範圍保持活動狀態時它是可訪問的。兩個都。
至於用於存儲實際文字字符串的內存實際發生了什麼,這是未指定的。只要結果符合C++標準,特定的C++實現就可以以任何更方便的方式管理運行時內存。就C++而言,您沒有訪問str
對象所使用的內存,而只是引用str
對象本身。
當然,你可以自由地拿一個原生char *
指針,指向str
中的一個字符。但是,指針是否有效直接與底層對象的範圍相關聯。當對應的str
對象超出作用域時,指針不再有效,訪問指針的內容變爲未定義的行爲。
請注意,在str
位於全局命名空間的情況下,str
的範圍是程序的生命週期,因此該點沒有實際意義。但是,str
在本地範圍內,並且超出範圍時,使用指針變成未定義的行爲。底層內存會發生什麼變化是無關緊要的。 C++標準並沒有真正定義底層實現中內存應該或不應該發生什麼,但是什麼是或者不是未定義的行爲。
基於此,您幾乎可以自己找出std::string
個案的答案。這是同一件事。您正在訪問std::string
對象,而不是基礎內存,並且適用相同的原則。
但是請注意,除了範圍問題外,std::string
對象的一些方法(但並非全部)也被指定爲使所有現有的直接指針和迭代器都無效到其內容,因此這也會影響是否a將char *
指定給std::string
中的其中一個字符仍然有效。
字符串文字具有「靜態」存儲持續時間,所以它**總是**在程序的整個生命週期中都存在。 –
'std :: basic_string'不擁有文字,因此它的生存期不是由'str'確定的。 – edmz