2010-09-06 132 views
0
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++中的異常處理?

+1

你的問題是什麼? – 2010-09-06 22:31:05

+0

是什麼問題? – 2010-09-06 22:32:10

回答

6

有沒有便攜的方式來做到這一點。在呼叫clear()之後,實現完全可以自由地保持緩衝區,而不需要修改。如果,OTOH,clear()釋放字符串的緩衝區,cstr現在指向未分配的內存,但即使如此,它也取決於內存分配器如何處理它。調試分配器會使用0xDEADBEEF等魔術數字填充該塊,並且生產分配器可能會保持原樣,或將整個頁面返回給操作系統。

不論你如何切割它,在字符串被突變後使用c_str()返回的指針都是未定義的行爲。故事結局。

1

沒有必要檢查任何東西。根據定義,它沒有。一旦字符串以任何方式被修改,c_str()的結果是無效的。也許一次使用它不會崩潰,但下一次可能會。碰撞很少得到保證。

如果要繼續使用文字(特別是指引號中的不可修改字符串,"string"),請將其分配給單獨的變量。

char const str_lit[] = "string"; 
std::string str = str_lit; 
... 
2

你不能。

通過str.c_str()在不能保證有效在下屬串之後的任何方式返回的指針已經改變。

例如,您可能會在那裏找到一個字符串,或者在那裏找到null,或者拋出訪問衝突錯誤。

我懷疑你有代碼不明白這一點,你試圖測試訪問該指針是否安全。 不是。

相關問題