C++变量在堆中还是栈中

上一篇 / 下一篇  2012-08-07 10:08:25 / 个人分类:C++

6r%qYRg7t@t0  C++自己写了很久都弄混几个常见的错误,堆 栈,托JingWei和Xiaoma的指导终于弄清楚,果然是工作几年的大牛就不一样。呵呵。51Testing软件测试网~6J(B2gY

*\)F4hQi.[0  直入主题。

.b D,Ew%_{051Testing软件测试网\[ J#JQ9M3H-y/F;Jr\|

  C++中,局部函数里面,new一个内存块,地址是在堆中,而其他的变量基本在栈中。栈中的变量内存随着局部函数的结束而被自动销毁,堆的则不会,需要自己delete销毁。

CvA/RW7Q U'q`051Testing软件测试网Bg(`V Gi

  举个常见的错误:

Q1u7A O;bJ C%[0
51Testing软件测试网S9H)N+e$c$|!?N

int* Func1()
8c9t!RK!@+kC7U Ev0{ int p[2];//内存在栈中51Testing软件测试网%x!}]"D&xiX
        p[0]=1;51Testing软件测试网/jJ`|)Y C;b1t's u
 p[1]=2;
5v DA3Gr+{6f0 return p;
9{gW ?afe.Q0}

L~7\x ibR051Testing软件测试网{5OFf vy/^|'g

int 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
{
3l g&O5GAR0 int *p=Func1();51Testing软件测试网z$Y Kz} Ap"W B;P7m8_G
 int temp[20]={0};//随意申请些变量,修改下栈51Testing软件测试网 gS`(C,kK@%~FY
        cout<<p[0]<<endl;
2Q-o%N\vQ,l0R0 return 0;51Testing软件测试网)RjfZ2u5J:Q_n
}

X`+@A)ja"aq0  这下子结果可能就乱七八糟了,因为栈已经被修改了,导致p指针指向的内存块地址已经无效。51Testing软件测试网 P){LdY(t LB"I_

51Testing软件测试网Ed Z:n m,["s'Q

  正确的做法,用new 从堆中申请一个内存块:

J"z!Z}uf}"e P0
51Testing软件测试网cdJ(J\!t

int* Func1()51Testing软件测试网 Bo2u#Y"N"@U F/p
{
)M3i5d1j%w1u`0 int *p=new int[2];//内存块在堆中
%n.Gs)z ?1jjKb0 p[0]=1;
I d4Dt&_0 p[1]=2;51Testing软件测试网0| c-GR]1| r4^L
 return p;51Testing软件测试网Oe*|+p uv[2N
}
51Testing软件测试网{5C6i;r9y:q%aU

w*WU-TL K8A0int 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$s G0}
51Testing软件测试网bG8r1`~? u+M

51Testing软件测试网A%o#w4W"vF @

  上面的输出就可能正确的了。

j s"^~K1q'R _ cO0

TAG:

 

评分:0

我来说两句

Open Toolbar