开发平台(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的变量还能存取到他的数值呢?
请版上先进指教, 谢谢。