C++变量在堆中还是栈中
上一篇 /
下一篇 2012-08-07 10:08:25
/ 个人分类:C++
6r%qYRg7t@t0 C++自己写了很久都弄混几个常见的错误,堆 栈,托JingWei和Xiaoma的指导终于弄清楚,果然是工作几年的大牛就不一样。呵呵。51Testing软件测试网~6J(B2gY
*\)F4hQi.[0 直入主题。
.bD,E w%_{051Testing软件测试网\[J#JQ9M3H-y/F;Jr\| C++中,局部函数里面,new一个内存块,地址是在堆中,而其他的变量基本在栈中。栈中的变量内存随着局部函数的结束而被自动销毁,堆的则不会,需要自己delete销毁。
CvA/RW7Q U'q`051Testing软件测试网Bg(`VGi 举个常见的错误:
Q1u7AO;b J C%[051Testing软件测试网S9H)N+e$c$|!?N int* Func1() 8c9t!RK!@+kC7UEv0{ int p[2];//内存在栈中51Testing软件测试网%x!}]"D&xiX p[0]=1;51Testing软件测试网/jJ`|)Y C;b1t's
u p[1]=2; 5vDA3Gr+{6f0 return p; 9{ gW?afe.Q0} L~7\x ibR051Testing软件测试网{5OFf vy/^|'gint main() %m7f#O%PK9Bec!F0{ )D-`(t+[n%w#gUX0 int *p=Func1(); +EA9|\G ao0 cout<<p[0]<<endl; @s#bx#fH
p
AM0 return 0; u8o-\Tcks\0}51Testing软件测试网s_ XCB!j7O |
9?k;R8xe2s0 上面错在哪里? 因为p指向这块内存在栈中,是可能随时要被被销毁的。所以不能保证你输出的结果正确与否。但是为什么说可能呢,因为栈可能没有这么快销毁这块内存,所以说你的输出的结果可能暂时还是正确的,但是大家可以试下,但是将代码稍微改下:51Testing软件测试网C@'go4](p1w
int main()51Testing软件测试网3@%J5fF3y%I9W.z { 3lg&O5GAR0 int *p=Func1();51Testing软件测试网z$Y Kz} Ap"WB;P7m8_G int temp[20]={0};//随意申请些变量,修改下栈51Testing软件测试网 gS`(C,kK@%~FY cout<<p[0]<<endl; 2Q-o%N\vQ,l0R0 return 0;51Testing软件测试网)Rj fZ2u5J:Q_n } |
X`+@A)ja"aq0 这下子结果可能就乱七八糟了,因为栈已经被修改了,导致p指针指向的内存块地址已经无效。51Testing软件测试网
P){LdY(tLB"I_
51Testing软件测试网EdZ:nm,["s'Q 正确的做法,用new 从堆中申请一个内存块:
J"z!Z}uf}"e P051Testing软件测试网cdJ(J\!t int* Func1()51Testing软件测试网
Bo2u#Y"N"@U
F/p { )M3i5d1j%w1u`0 int *p=new int[2];//内存块在堆中 %n.Gs)z?1j jKb0 p[0]=1; I
d4Dt&_0 p[1]=2;51Testing软件测试网0| c-G R]1| r4^L return p;51Testing软件测试网O e*|+p u v[2N }51Testing软件测试网{5C6i;r9y:q%aU w*WU-TLK8A0int main()
V
v8M
\|^@ij0{51Testing软件测试网 Q}!`?(r
v int *p=Func1();//指向了Func1里面申请的堆的内存块51Testing软件测试网0KOlk]3u n cout<<p[0]<<endl;//输出正确 9r&L"l)p3bv5_N&u0 return 0; (V^/V$sG0}51Testing软件测试网bG8r1`~?u+M |
51Testing软件测试网A%o#w4W"vF
@ 上面的输出就可能正确的了。
j s"^~K1q'R_
cO0
收藏
举报
TAG: