class A {
public:
A() { m_value = 0; }
int getValue() {
return m_value;
}
A &Do() {
A a;
//....
return a;
}
private:
int m_value;
};
int main()
{
A a;
A b = a.Do();
printf("value=https://bbs.csdn.net/topics/%d/n", b.getValue());
return 0;
}
uj5u.com熱心網友回復:
a.Do()是錯誤,之所以不報錯因為區域變數是在堆疊上,而堆疊的銷毀,是同過移動堆疊頂指標來做到,他的資料還在堆疊記憶體上,只是移動堆疊頂指標,表示那塊地址程式已經不用了,別的程序可以使用,你讀取的資訊只是一個殘留。一個不確定的資料。你想想如果記憶體中一段資料生命期結束,難道需要把它們全部抹0,這個是沒必要的,只要標記那塊地址無效即可。第二因為你的類只有簡單資料,如果你的類里面包含一個指標,建構式和解構式里面new和delete,你就就會立刻發現錯誤
uj5u.com熱心網友回復:
可能因為微軟幫你優化了吧。這是錯誤的語法。
GCC不會這么幸運。
uj5u.com熱心網友回復:
有沒有銷毀你看看匯編就知道了你看輸出是無法判斷是否銷毀的
uj5u.com熱心網友回復:
不要有銷毀了記憶體資料就會發生變化的奇怪概念uj5u.com熱心網友回復:
函式堆疊撤銷,區域變數就變成垃圾記憶體,如果該記憶體沒有被復用復寫,資訊會保留(于是就出現了LZ的情況,資訊還在),但對程式來說該記憶體已經無效(也就是訪問非法記憶體),這是一種危險的行為。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/144558.html
標籤:C++ 語言
