【原】关于c中int a=1; int b=a类型问题的思考

由于之前接触过一段时间IOS,在IOS里面内存管理很重要,而且对于初学者来说是件不大容易的事情,必须处处小心。重新回到C/c++编程时,有几个概念一直纠缠不清,有点跟IOS混掉的味道了。所以,这里就理理思路:

先看个例子:

1              int a = 4;
2              int b = a;
3              a ++;//b此时为何值?

这是最经常遇到的小例子,以前总是不在意,没有去细细想清楚。在上面这种情况下,b会随着a变化而变化吗?NO。b此时仍旧是4。这里的a、b只是一种“标签”,可以看作贴在箱子上的标签,这里的“箱子”就是内存块。标签就代表着实际的内存块,对标签的操作也就是对内存块的操作。它与指针的两码事! 而int b = a这条语句,把a拷贝一份,赋给b。a b所贴的内存块是不一样的!!

与下面这个例子做对比:

1              int a = 4;
2              int *c = &a;//c指向a的地址
3              a++;

在上面这种情况下,c与a所指的内存块就是一样的。因为这里的c已经明确定义为指针,且指向a的地址

 

还有一种例子也经常混掉:

             IplImage *p1 = cvLoadImage( "Lena.jpg" );
             IplImage *p2 = p1;
             p1 = NULL ;//or cvReleaseImage(p1);释放图像

IplImage *是OpenCV里面的东西,它代表一张图。经过第二句后,p1与p2指向相同的对象,在底层就是指向同一块内存块。问题就来了,在第三句执行完毕后,p2还指向原来的对象吗?调试表明,YES。以前一直纠结着,p1都被置为空了(NULL),那原来的对象是不是也跟着被销毁了?其实,错了。

首先,我们应该把指针与其所指的对象分开看。指针重定向或者被置为NULL,对于其原先所指的对象的没有影响的。(但其实,应该会造成内存泄露,因为如果没有其他指针“接管”这部分内存块,就成无名的内存块摆在那边了,也就无法释放掉)  在p1重定向后,p2仍旧指向原来的对象。在此刻,p1与p2其实就是两个无关的事务了,也就是“分家”了。

以上的思考不知对不对,还望指出。我是奋斗的IT小蜗牛,我是编程小翁

posted @ 2013-03-25 12:31  编程小翁  阅读(1635)  评论(0编辑  收藏  举报
我是来自厦门的Jilon. 翁,请关注我的微博:真实的weng,或关注微信:Jilon