浅析C++内存管理机制

         这几天做项目,专门发时间研究了下C++的内存管理机制。之前项目程序运行500*500的线性系统,内存开销达到2G,这个数字有点吓人。今天上午超有耐心的跟踪每个对象的构造销毁情况,终于发现了程序的Bug。修改程序之后,所占内存只有几M,哈哈,这可是天壤之别啊。

         C++中,一定要区分对象、引用和指针的区别。

引用可以指向一个对象,也必须指向一个存在的对象,一旦指定了对象,则不能再指向其他的对象,但是其指定的对象的内容可以修改。

指针可以指向一个对象,也可以指向NULL,并且它还可以再更改为指向其他对象。

C++中,函数若以对象的形式传参/返回,则其在传参/返回时会得到对象的一个拷贝,而不是用的对象本身。所以传对象或者返回对象势必造成内存开销的增大。

假若函数以引用或指针的形式传参/返回,则不会产生一个拷贝,而是直接用它本身。这样可以节省宝贵的内存资源,但是也会引发一些非常容易忽视的问题。

1、以引用或者指针的形式传参,函数对其的修改是双向的,假若该方法不能修改参数,为了程序的严谨,在参数前必须加const

2、一定不能返回一个栈对象的引用。局部栈对象出了作用域之后就会被自动销毁,而外部程序再调用它是不合法的。有时这样调用或许不会出错,那是因为栈对象的内存地址还没有被写入其他数据,否则再调用它是会出错的。

3、谨慎使用返回一个堆对象的指针。因为堆对象是new出来的,那么它也必须通过delete显示的释放。假如你在函数里new了一个堆对象,然后又要返回该对象,这样返回时,返回的是堆对象本身,所以,销毁该堆对象就必须留给调用该方法的函数,如果调用函数没有delete堆对象,那么,这里就会出现内存泄露问题了。用一个while死循环来运行调用函数,电脑必定一下子就崩溃。

4、不要以引用的形式返回堆对象。局部堆对象是必须显示的delete来释放内存,而以引用的形式返回,则在调用函数里它是以引用的形式体现的。所以,应该是要自动销毁的,但是它本质上是一个堆对象的,是不能自动销毁的。所以,这样做更容易产生内存泄露。

 

综上所述,最好以引用/指针的形式传参,如果方法不能修改参数,则在参数前加const。返回值最好以对象的形式返回,除非调用函数会显示调用delete来释放堆对象,则可以以指针的形式返回。返回引用类型一般都是用于返回对象自身的引用。(如果这些内容有不完善或者错误的地方,欢迎大家指点!)

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值