贊助廠商

娛樂城推薦

首頁

電腦與網際網路/其他:電腦列表

C/C++- 請問local變數在離開stack後為何能存取

開發平台(Platform): (Ex: Win10, Linux, ...) win10/debian編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)VC2008/gcc程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) #include <stdio.h>struct StructB{ int m_nB; StructB() { m_nB = 0; } ~StructB() { printf("~StructB()\n"); }};struct StructA{ StructA() { m_pB = NULL; } StructB *m_pB;};void foo(StructA &p_stA){ StructB stB; stB.m_nB = 1; p_stA.m_pB = &stB;}int main(){ StructA stA; foo(stA); printf("stA.m_pB->m_nB = %d\n", stA.m_pB->m_nB); printf("stA.m_pB->m_nB = %d\n", stA.m_pB->m_nB); // 連續兩次看結果 return 0;}補充說明(Supplement):今天工作上我看到project code有很明顯的問題如下.有一個struct其中一個member是一個pointer,這個struct產生一個member object放在一個class裡面.而我尋找這個pointer並沒有任何地方去new物件出來,而是直接在一個function裡面產生一個local變數,然後把local變數的位址設定給這個pointer.問題來了, 設定local變數給這個struct的pointer,然後離開這個function回到上一層stack, local變數不就free掉了嗎?再去存取這個struct pointer不是應該就會出問題?但結果沒有, 我用VC debug看程式竟然還能存取到正確的值.這讓我對以前變數lifecycle學習產生了質疑,因此我直接寫了上方簡單的程式碼來驗證這件事.我分別用VC以及gcc在win10/debian底下去執行上面的程式碼,神奇的事發生了win10:第一次printf看到印出的值正確為1, 第二次變為-2.debain:兩次都為1.我確認StructB的解構式已經"先"印出來才印出數值,為何被free的變數還能存取到他的數值呢?請版上先進指教, 謝謝。--
  • 發問日期:2021-06-02 09:20:03

友站連結