贊助廠商

娛樂城推薦

首頁

刊登資訊

  • 刊登者:匿名
  • 時間:2021-06-02 09:20:03

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

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的變數還能存取到他的數值呢?

請版上先進指教, 謝謝。

--

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

其他問題

友站連結