開發平台(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的變數還能存取到他的數值呢?
請版上先進指教, 謝謝。