std::string str = "string":
const char* cstr = str.c_str();
str.clear();
//here, check if cstr points to a string literal.
如何在調試模式或釋放模式下運行程序時檢查cstr
仍指向字符串?如何判斷const char *是否指向有效的字符串?
會有一種方法來確定這使用C++中的異常處理?
std::string str = "string":
const char* cstr = str.c_str();
str.clear();
//here, check if cstr points to a string literal.
如何在調試模式或釋放模式下運行程序時檢查cstr
仍指向字符串?如何判斷const char *是否指向有效的字符串?
會有一種方法來確定這使用C++中的異常處理?
有沒有便攜的方式來做到這一點。在呼叫clear()
之後,實現完全可以自由地保持緩衝區,而不需要修改。如果,OTOH,clear()
釋放字符串的緩衝區,cstr現在指向未分配的內存,但即使如此,它也取決於內存分配器如何處理它。調試分配器會使用0xDEADBEEF等魔術數字填充該塊,並且生產分配器可能會保持原樣,或將整個頁面返回給操作系統。
不論你如何切割它,在字符串被突變後使用c_str()
返回的指針都是未定義的行爲。故事結局。
沒有必要檢查任何東西。根據定義,它沒有。一旦字符串以任何方式被修改,c_str()
的結果是無效的。也許一次使用它不會崩潰,但下一次可能會。碰撞很少得到保證。
如果要繼續使用文字(特別是指引號中的不可修改字符串,"string"
),請將其分配給單獨的變量。
char const str_lit[] = "string";
std::string str = str_lit;
...
你不能。
通過str.c_str()
在不能保證有效在下屬串之後的任何方式返回的指針已經改變。
例如,您可能會在那裏找到一個字符串,或者在那裏找到null,或者拋出訪問衝突錯誤。
我懷疑你有代碼不明白這一點,你試圖測試訪問該指針是否安全。 不是。
你的問題是什麼? – 2010-09-06 22:31:05
是什麼問題? – 2010-09-06 22:32:10