C++内存管理的探讨(1)(2)
对于上面的程序,我们需要改动的是令变量j指向一个地址被释放的位置。于是就有了下面的程序:
- int * foo()
- {
- int l=20;
- return &l;
- }
- int main()
- {
- int i=10;
- int *j=&i;
- j = foo();
- cout<<*j;
- 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;与上面的相同。不要去想上面这些程序了,大家再看看下面这个。
- void f1( int *& j)
- {
- int l=20;
- int *k=&l;
- j=k;
- k=0;
- }
- void any_function_use_local_variables()
- {
- int a,b,c;
- a=b=c=100;
- }
- int main()
- {
- int i=10;
- int *j=&i;
- f1(j);
- cout<<*j;
- any_function_use_local_variables();
- cout<<*j;
- return 0;
- }
请大家自己编译、执行,看看结果是什么,然后结合上面的两个例子,想想是为什么。下面再给大家一个小例子,可能会有助于理解内存的概念。
程序的过程是试图去增加i,使之超过最大的整数。有一种情况是这个值被“卷回来”变成一个负数,在我的机器上程序的打印结果是-2147483648,这个结果可能因为硬件的不同而不同。
- int main()
- {
- int i=1;
- while(0<i) i++;
- cout<<i;
- return 0;
- }
- 上一篇:C++设计目标及原则(1)
- 下一篇:细说C++委托和消息反馈模板(1)