龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > C/C++开发 >

C++内存管理的探讨(1)(2)

时间:2011-04-12 23:18来源:未知 作者:admin 点击:
分享到:
对于上面的程序,我们需要改动的是令变量j指向一个地址被释放的位置。于是就有了下面的程序: int *foo() { int l=20; return l; } int main() { int i=10; int *j=i; j

对于上面的程序,我们需要改动的是令变量j指向一个地址被释放的位置。于是就有了下面的程序:

  1. int * foo()  
  2. {   
  3. int l=20;  
  4. return &l;  
  5. }  
  6.  
  7. int main()  
  8. {  
  9. int i=10;  
  10. int *j=&i;  
  11. j = foo();  
  12. cout<<*j;  
  13. return 0;  

编译器很“聪明”,编译后会给出一个警告。原话是“returning address of local variable or temporary”,指向的是上面程序的第四行,也就是return &l;这条语句。那句英文的意思也不用我再多解释了,相信大家都能看得明白。

执行的结果,在debug下,是20;在release下,结果是4198795。显然那部分内存被释放掉了。这是因为在debug的程序里面,执行完函数foo,并没有立即释放掉l的那个地址(目前我不清楚这句话说得是否精确)。在这个程序的release版本中,显然程序释放了那部分的地址,所以指向了一个不确定的数。

这里还要说一件事情,就是在第一个程序当中,无论是debug版本还是release版本。执行完那个if语句以后,系统都是不会真正的把l清除掉,l只是k的一个别名。上面的程序是这样写的,用了*j=&i这样一句负值语句,而别名在MSDN中的解释与引用是相同的,所以也可以这样理解,int i=10; int &j=i;与上面的相同。不要去想上面这些程序了,大家再看看下面这个。

  1. void f1( int *& j)  
  2. {   
  3. int l=20;   
  4. int *k=&l;   
  5. j=k;   
  6. k=0;   
  7. }  
  8. void any_function_use_local_variables()  
  9. {  
  10. int a,b,c;   
  11. a=b=c=100;   
  12. }  
  13.  
  14. int main()  
  15. {   
  16. int i=10;   
  17. int *j=&i;   
  18. f1(j);   
  19. cout<<*j;   
  20. any_function_use_local_variables();   
  21. cout<<*j;   
  22. return 0;  
  23. }  

请大家自己编译、执行,看看结果是什么,然后结合上面的两个例子,想想是为什么。下面再给大家一个小例子,可能会有助于理解内存的概念。

程序的过程是试图去增加i,使之超过最大的整数。有一种情况是这个值被“卷回来”变成一个负数,在我的机器上程序的打印结果是-2147483648,这个结果可能因为硬件的不同而不同。

  1. int main()  
  2. {   
  3. int i=1;   
  4. while(0<i) i++;   
  5. cout<<i;   
  6. return 0;  
  7. }  
精彩图集

赞助商链接