【原】关于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小蜗牛,我是编程小翁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值