編輯:有關此問題代碼工作原因的問題已通過重複標記中的鏈接問題得到解答。關於字符串文字生存期的問題在這個問題的答案中得到了回答。const char * value lifetime
我想了解如何以及何時const char *
指向的字符串被取消分配。
考慮:
const char **p = nullptr;
{
const char *t = "test";
p = &t;
}
cout << *p;
離開內部範圍後,我希望p
是懸空指針const char *
。但在我的測試中,它不是。這意味着即使在t
超出範圍之後,t
的值實際上仍然有效且可訪問。
這可能是由於通過將其綁定到const引用來延長臨時的生命週期。但我不這樣做,即使將參考文獻t
保存在一個成員變量中,稍後從不同函數打印值仍然會給我它的正確值。
class CStringTest
{
public:
void test1()
{
const char *t = "test";
m_P = &t;
test2();
}
void test2()
{
cout << *m_P;
}
private:
const char **m_P = nullptr;
};
那麼t
的價值在這裏的壽命是多少?我會說我通過取消引用一個指向超出範圍的變量值的指針來調用未定義的行爲。但它每次都有效,所以我認爲情況並非如此。
當嘗試一些其他類型的像QString
:
QString *p = nullptr;
{
QString str = "test";
p = &str;
}
cout << *p;
代碼始終打印值也正常,即使它不應該。 str
以其價值超出了範圍,並且我也沒有通過將其與常量參考綁定來延長其壽命。
有趣的是,帶有QString
的類示例的行爲與我所預期的相同,test2()
會打印亂碼,因爲該值確實超出了範圍,m_P
成爲懸掛指針。
那麼const char *
的實際使用壽命值是多少?
您無法測試是否有什麼懸掛。任何嘗試這樣做都會有不確定的行爲。 –
這基本上是一個重複http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope與一個問題關於字符串文字的生命期 –
_「在我的測試中,它不是」_LOL你什麼? –