[英]string::c_str query
通過調用string :: c_str()返回的指針指向何處? 在下面的代碼片段中,我以為我會遇到分段錯誤,但它會為我提供正確的輸出。 如果string :: c_str()返回的指針指向字符串對象內部的內部位置,那么當函數返回並且調用對象析構函數時,我應該獲得無效的內存訪問。
#include <iostream>
#include <string>
using namespace std;
const char* func()
{
string str("test");
return str.c_str();
}
int main()
{
const char* p = func();
cout << p << endl;
return 0;
}
Output: test
Compiler: g++ 4.3.3
Platform: ubuntu 2.6.28-19
通過調用
string::c_str()
返回的指針指向何處?
它指向內存中某個包含std::string
內容的以空終止的字符串的位置。
該指針僅在std::string
被修改或銷毀之前才有效。 如果再次調用c_str()
或data()
,它也可能無效。
基本上,最安全的選擇是假設下次您對std::string
對象執行操作時,從c_str()
獲得的指針無效。
我應該獲得無效的內存訪問權限。
不,您會得到不確定的行為。 您可能會遇到某種內存訪問錯誤(例如分段錯誤),但是您的程序似乎也可以繼續正常運行。 它可能在您一次運行程序時起作用,但下次卻失敗。
您希望將其打印出來嗎?
#include <iostream>
#include <string>
int main()
{
int* test = new int[20];
test[15] = 5;
std::cout << test[15] << "\n";
delete[] test;
std::cout << test[15] << "\n";
return 0;
}
在VS 2010的發布模式下,我得到以下結果:
5
5
當您嘗試訪問已釋放的內存時,不一定會引發異常。 該值也不一定要重寫。 (有趣的是,如果我將編譯方式更改為調試方式,則編譯器將使用-572662307
覆蓋該值)。
標准未定義您嘗試訪問它時會發生什么。 這意味着編譯器可以做任何想做的事情,或者選擇什么都不做。 (或者崩潰程序,或者炸毀宇宙……)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.