当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>内存陷阱:顺服C++中的野指针</b>[VC/C++编程]

赞助商链接



  本文“<b>内存陷阱:顺服C++中的野指针</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

 什么是野指针?

一个母亲有两个小孩(两个指针),一个在厨房,一个在卧室,(属于差别的代码块,其生存期差别)母亲让在厨房的小孩带一块蛋糕(指针指向的对象)给在卧室的小孩,这样在卧室的孩子才肯写功课.但这个在厨房的小孩对比调皮,他在走出厨房时自己将蛋糕吃了,没能带出来.而在卧室的没有吃到蛋糕,所以不肯完成他的功课.后果母亲却不知道卧室的孩子没有吃到蛋糕,还认为功课完了.后果第二天她就被老师呼唤到办公室了.事情麻烦了.

这样,那个在卧室的孩子就是野指针了,因为他没有得到应得的蛋糕,不能完成母亲交给他的功课.

这就是c中所讲的野指针.上面的小脚本不过演示了一种最基本的野指针的形成历程.更简单呈现的情形是coder在编码时,粗心之下利用了已经free过的指针.

关于年青点的经验欠缺的coder来说是对比简单犯的错误,经验纯熟的程序员大概慎重采纳成对编程的情势避免这种失误,大概利用引用计数器避免形成野指针.

总之,在c中,野指针大概性子野,但是掌握起来也是有章可循.但是事情在c++中呈现了改变.

coder们面对更大的麻烦了.c++程序员无可避免的要写很多这样那样的类.谁让c++是面向对象的呢?

我们在写类的时刻不免要用new给类的数据成员分配内存.这本来没什么,动态分配内存是一种很常见的基本操作,我们在学数据构造经常常这么做,不是么?

但是伴计,事情并非这么简单.类是一种高级的用户自定义数据范例,看起来和构造、列举这样的用户自定义范例没啥太大差别.假如你这样认为....?那你会死的很惨.类太复杂了,普通情形下利用类的对象并没有太大的问题,但是,当你要复制一个对象时,问题就来了.

比方我们知道,你要用一个对象初始化另一个对象时,c++是按位举行拷贝的,即在目标对象里成立了初始化对象的一个完好相同的拷贝.这在大都情形下已经充足了.但是,当你的类在成立时为每个对象分配内存,也就是说类中有new操作.当你的对象成立好后,类也为对象分配了一块内存.假如你用这个对象去初始化另一个对象时,被初始化的对象和初始化的对象完好一样.这意味着,他们利用同一块内存,而不是重新为被初始化的对象分配内存.

这样麻烦就大了.假如一个对象销毁了,那么分配的内存也就销毁了(别忘了,类是有析构函数的,它负责在对象销毁时,释放动态分配的内存.莫非你说你不在类中写上析构部份?那么可怜的孩子,那你就走向了另一个深渊,当你的程序运行数小时之后,系统会奉告你,内存不够用了.想象一下把你的程序用在腾讯的服务器上),另一个对象就残缺不全了,这就像一对连体婴儿,他们共用了一部份器官,心脏大概肝脏.要救活一个,就牺牲了另一个.一个抱病了,另一个也要遭殃.

可以说,这就是c++中越发变态的野指针.

什么?你说我不用对象初始化对象?那么我们会不会将一个对象作为变元传送给函数呢?我们很多时刻都这样做.有时我们不得不将对象按值传送给一个函数,但是你要知道,按值传送是什么意思?它的意思就是,把实参的一个拷贝传送给函数.这和方才的初始化没什么两样,按位拷贝,函数体内的对象与表面的对象共用一块内存,即便在函数中的对象没有对这块内存举行过操作,但是当函数完毕时....析构函数将会被调用......

还有一种与之相反的情形......, 当你想要把一个在函数内的对象值返回给表面的对象时,这时刻,会自动产生一个暂时对象,由它包容函数的返回值,并在函数完毕时把后果传给目标.那么这个暂时对象疾速的被成立,并被疾速的释放...一块内存被释放了两次.后来果是不可预见的.

当你把一个对象的值赋给另一个对象时,假如你没有重载赋值运算符,那么也会招致按位拷贝.终究产生一个野指针(一个躲藏在类内的毒瘤),大概释放同一块内存多次.

看到了么?惊骇了么?是不是感到C++处处都是陷阱呢?不但有陷阱,处处都是危险品.全部c中的疑问问题,到了c++就成了普通问题了.好了不废话了,我们持续讲讲授决之道.

关于最后的这种赋值的情形,我们只有通太重载赋值运算符才能办理,也就是避免按位拷贝.

至于前面的都属于初始化,概括下来就是三种情形:

1.当一个对象初始化另一个对象时,比方在声明中;

2.把所成立的对象拷贝(按值)传送给一个函数时;

3.生成暂时对象时,最常见的就是函数的返回值.

办理初始化时的按位拷贝问题,我们通过成立拷贝构造函数来办理.

基本的拷贝构造函数情势为:

classname (const classname &o)

{

//body here

}

拷贝构造函数就是针对这个问题而计划的.

恩,大家都懂得了吧?不要让你的对象都变成可怜的连体人啊~~~~


  以上是“<b>内存陷阱:顺服C++中的野指针</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .