版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C++内存管理详解程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。1、内存分配方式内存分配方式有三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。2、常见的内存错误及其对策发生内存错误是件非常麻烦的事情。编译器不能自动发现这些错误,通常是在程序运行时才能捕捉到。而这些错误大多没有明显的症状,时隐时现,增加了改错的难度。有时用户怒气冲冲地把你找来,程序却没有发生任何问题,你一走,错误又发作了。常见的内存错误及其对策如下:*内存分配未成功,却使用了它。编程新手常犯这种错误,因为他们没有意识到内存分配会不成功。常用解决办法是,在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处用assert(p!=NULL)进行检查。如果是用malloc或new来申请内存,应该用if(p==NULL)或if(p!=NULL)进行防错处理。*内存分配虽然成功,但是尚未初始化就引用它。犯这种错误主要有两个起因:一是没有初始化的观念;二是误以为内存的缺省初值全为零,导致引用初值错误(例如数组)。内存的缺省初值究竟是什么并没有统一的标准,尽管有些时候为零值,我们宁可信其无不可信其有。所以无论用何种方式创建数组,都别忘了赋初值,即便是赋零值也不可省略,不要嫌麻烦。*内存分配成功并且已经初始化,但操作越过了内存的边界。例如在使用数组时经常发生下标“多1”或者“少1”的操作。特别是在for循环语句中,循环次数很容易搞错,导致数组操作越界。*忘记了释放内存,造成内存泄露。含有这种错误的函数每被调用一次就丢失一块内存。刚开始时系统的内存充足,你看不到错误。终有一次程序突然死掉,系统出现提示:内存耗尽。动态内存的申请与释放必须配对,程序中malloc与free的使用次数一定要相同,否则肯定有错误(new/delete同理)。*释放了内存却继续使用它。有三种情况:(1)程序中的对象调用关系过于复杂,实在难以搞清楚某个对象究竟是否已经释放了内存,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面。小(酿2用)函数的盾retur须n崇语句写错了受,注意不要烘返回指向柏“暂栈内存必”窄的监“地指针亿”僵或者爬“触引用味”米,因为该内松存在函数体软结束时被自身动销毁。芬(屋3嗽)使用绞free为或侮delet耀e扯释放了内存尤后,没有将阻指针设置为守NULL投。导致产生朽“国野指针锐”田。僻【规则帜1射】用忌mallo甚c壤或负new球申请内存之龟后,应该立未即检查指针滑值是否为樱NULL廊。防止使用单指针值为贪NULL呜的内存。野【规则搅2优】不要忘记斑为数组和动蠢态内存赋初质值。防止将告未被初始化卖的内存作为垄右值使用。员【规则计3米】避免数组菠或指针的下刑标越界,特钉别要当心发哪生渴“脸多数1”盗或者牺“袜少贪1”乐操作。脸【规则塘4访】动态内存今的申请与释荐放必须配对叼,防止内存淋泄漏。骡【规则窄5育】用巷free搬或历delet胳e把释放了内存钢之后,立即芳将指针设置危为祥NULL坟,防止产生累“洲野指针饿”套。笋3邻、指针与数库组的对比加环C++/C暮程序中,指衰针和数组在与不少地方可汽以相互替换价着用,让人肚产生一种错呆觉,以为两物者是等价的街。妈数组要伟么在静态存刊储区被创建粮(如全局数趋组),要么乱在栈上被创宾建。数组名办对应着(而能不是指向)厅一块内存,布其地址与容互量在生命期敞内保持不变秆,只有数组缘的内容可以莫改变。恒指针可容以随时指向竭任意类型的诱内存块,它役的特征是周“块可变缠”坚,所以我们舞常用指针来提操作动态内盆存。指针远弦比数组灵活码,但也更危蛙险。交下面以风字符串为例辽比较指针与旨数组的特性环。牧悄3.1贴修改内容悼示例啊3-1撒中,字符数纠组拘a赛的容量是决6抓个字符,其浮内容为表hello未。秆a历的内容可以访改变,如盏a[0]=口‘X’躬。指针焰p稀指向常量字槐符串玻“朝world欲”代(位于静态云存储区,内起容为夜world趋),常量字图符串的内容鲁是不可以被吨修改的。从枯语法上看,编编译器并不宪觉得语句孔p[0]长=‘X’徒有什么不妥奇,但是该语沙句企图修改笛常量字符串自的内容而导夏致运行错误愤。赞char贞a[]=符“hel膨lo”;亡a[0]椒=‘X’轿;谱cout巩<<a盲<<en兽dl;虽char短*p=旅“栽world歪”氧;//浪注意p指向态常量字符串锐p[0]怎=‘X’牢;//巡编译器不能叼发现该错误万cout弄<<p非<<en晕dl;耗瞎示例违3.1啊修改数组和榨指针的内容速母蛾骡3.2酱内容复制与演比较捡不能对陡数组名进行葡直接复制与叙比较。示例暴7-3-2零中,若想把薯数组侮a巨的内容复制扣给数组吓b缝,不能用语邮句标b=样a吸,否则将产爷生编译错误馒。应该用标狐准库函数虽strcp急y碑进行复制。显同理,比较值b衔和标a群的内容是否忌相同,不能先用心if(b=吧=a)乌来判断,应菊该用标准库泪函数倘strcm已p严进行比较。爬语句询p=a跃叼并不能把捆a碍的内容复制质指针帽p触,而是把宋a蝇的地址赋给割了折p鬼。要想复制水a范的内容,可浪以先用库函厅数臣mallo嫁c棕为件p伙申请一块容练量为叶strle聪n(a)+撤1险个字符的内怖存,再用孤strcp稠y再进行字符串择复制。同理庙,语句零if(p=贝=a)罪比较的不是刊内容而是地监址,应该用击库函数亡strcm验p臭来比较。拜//齐数组知char蠢a[]=诱"hel沿lo";盐char精b[10]让;廉strcp歪y(b,泼a);/寺/不能用票b=怠a;口if(st现rcmp(柔b,a)石==0吊)//骤不能用i焦f(b狠==a)丸//建指针任intl绢en=工strle馒n(a);肚char璃*线p=(罩char幅*)mal此loc(s家izeof复(char假)*(le期n+1))桂;罩strcp划y(p,a仗);//删不要用植p=a渐;斜if(st爆rcmp(佩p,a)电争==0)乘//不派要用if烈(p=戒=a)至撤示例举3.2娇数组和指针椅的内容复制拨与比较茄郊常3.3闭计算内存容稳量皆用运算双符也sizeo消f怖可以计算出尚数组的容量鬼(字节数)士。墙示例化7-3-3陆(戚a撕)中,棵sizeo制f(a)项的值是秃12域(注意别忘嘉了奇’’渡)。指针贪p鹅指向握a豆,但是围size珍of(p)裕的值却是依4糖。这是因为答sizeo划f(p)尘得到的是一胁个指针变量肆的字节数,纸相当于页sizeo帐f(cha沉r*)惨,而不是坏p沫所指的内存项容量。虹C++/赶C获语言没有办阔法知道指针仍所指的内存拉容量,除非明在申请内存维时记住它。赛插注意当数组拘作为函数的统参数进行传担递时,该数侄组自动退化则为同类型的殿指针。雀示例汇7-3-3梨(沾b斩)中,不论疯数组愚a床的容量是多搁少,装sizeo菜f(a)喇始终等于女sizeo倍f(cha堵r调*)。榨char梁a[]=屠"hel株lowo温rld";田char画*p=侧a;本cout<搂<siz慌eof(a指)<<挑endl;扔//1撒2梳字节嚼cout<缺<siz窝eof(p雷)<<起endl;忆//4谅字节喊奋示例桂3.3钻(哪a激)椅场计算数组和胶指针的内存充容量名钻铲void尚Func(晴char商a[100猛])育{母cout顶<<si润zeof(铺a)<<急endl浆;//织4携字节而不是版100食字节尚}岩冲示例辞3.3柏(哑b怒)这伙数组退化为宴指针床4值、指针参数联是如何传递询内存的?皇鞋感如果函数的俭参数是一个省指针,不要来指望用该指拥针去申请动朋态内存。示绵例填7-4-1厉中,亩Test辩函数的语句射GetMe穷mory(钳str,湿200)偏并没有使瞎str封获得期望的袜内存,俩str题依旧是厚NULL粉,为什么烘?胞void计GetMe只mory(西char惨*p,i瞒ntnu馒m)阀{笛p=茧(char残*)ma套lloc(积sizeo浩f(cha粘r)*肆num);维}戏void钢Test(妹void)裹{亮char胳*str经=NU膀LL;历赶GetMe啦mory(熊str,攻100);育//s茂tr仪仍然为田NULL触劝strcp否y(str养,"he火llo")骄;//眯运行错误撇}轨蜡示例片4.1绳试图用指针惧参数申请动美态内存光径竟毛病出在函执数跟GetMe泪mory暂中。编译器万总是要为函粗数的每个参恭数制作临时室副本,指针王参数妈p贷的副本是罢_p仓,编译器使俩_p=桶p称。如果函数偷体内的程序私修改了冈_p挺的内容,就构导致参数请p围的内容作相壤应的修改。万这就是指针党可以用作输团出参数的原庆因。在本例邻中,廊_p救申请了新的秆内存,只是滤把锣_p海所指的内存客地址改变了乎,但是优p蓄丝毫未变。绩所以函数触GetMe爽mory改并不能输出汗任何东西。役事实上,每困执行一次扎GetMe植mory闲就会泄露一川块内存,因都为没有用叔free践释放内存。纠如果非肿得要用指针颈参数去申请处内存,那么埋应该改用捷“厅指向指针的渴指针芳”食,见示例夕4.2亚。休void架GetMe叼mory2谨(char毅**p,尤int鼻num)到{炊*p=弓(cha权r*)m产alloc采(size伶of(ch花ar)*岸num)射;禁}础void歇Test2罪(void啊)铁{玉char哨*str觉=NU秆LL;配GetM攻emory烈2(泪&str,眠100)猜;//银注意参数是段&暖str,而评不是str湿strc传py(st嫂r,"h咽ello"城);恩cout欲<<st革r<<咏endl;疼free蜜(str)肚;吴}限高示例穴4.2粗用指向指针窜的指针申请涂动态内存姓画宰碗由于安“狗指向指针的览指针诵”苦这个概念不更容易理解,益我们可以用辣函数返回值抚来传递动态初内存。这种秀方法更加简钳单,见示例络4.3霸。雨char帅*GetM厦emory科3(int脖num)芒{父char祖*p=主(cha晒r*)m居alloc请(size杂of(ch渔ar)剩*nu姨m);击retu沿rnp;劝}姜void杜Test3叉(void件)畜{慌char见*str砍=跌NULL赚;璃str肉=Get营Memor展y3(10搅0);拐strc殖py(st炎r,"h漠ello"渠);肃cout灶<<st黄r<<祖endl;枝free殖(str)皱;兄}槐寇示例挣4.3勾用函数返回磨值来传递动戚态内存哲极过用函数返回警值来传递动此态内存这种界方法虽然好芦用,但是常巩常有人把奥retur摧n谋语句用错了陆。这里强调轨不要用晴retur缓n斥语句返回指沟向荣“族栈内存劝”戏的指针,因吓为该内存在杯函数结束时角自动消亡,康见示例数4.4颜。趋务char漂*GetS窄tring狐(void趋)汪{生char捡p[]弦="he况llow碌orld"扩;妻retu塘rnp;牙//蝇桂编译器将提认出警告臭}扇void绣Test4电(void勤)码{纷char枪*str宿=NU欣LL;智str姨=龟GetS千tring蚊();/换/str辨缘的内容是垃湿圾柜cout呼<<st绪r柏<<e类ndl;多}吐遇示例公4.4r盲eturn暴语句返回指阀向劣“蛮栈内存丈”塞的指针盏邀丝惯用调试器逐病步跟踪砍Test4同,发现执行评str=脸GetS苹tring翼语句后怜str股不再是灿NULL浮指针,但是鼠str速的内容不是纲“抵hello脖袭world摧”避而是垃圾。裳如果把示例排4.4弊改写成示例起4.5鸦,会怎么样快?贴char全*GetS桂tring餐2(voi抚d)版{小char幅*p=敲"hel闲lowo讨rld";拐retu壤rn盆p;遗}寸void脱Test5代(void撕)临{遮char抵*str拾=NU燃LL;治s丛tr=演GetS司tring牧2();援cout集<<st选r<<鹿endl;摇}闪尖示例4.5断retu谎rn卸语句返回常恢量字符串熊函数错Test5挺运行虽然不嘱会出错,但汪是函数夏GetSt歌ring2另的设计概念评却是错误的拢。因为志GetSt纠ring2心内的帽“水hello泡worl须d”危是常量字符腹串,位于静脾态存储区,强它在程序生撑命期内恒定等不变。无论落什么时候调俭用债GetSt盾ring2付,它返回的躬始终是同一核个晶“偿只读耻”金的内存块。兄疫5岂、杜绝昼“滚野指针愧”状净“挎野指针稠”素不是汇NULL素指针,是指窝向洽“肤垃圾学”蓄内存的指针毙。人们一般奔不会错用旋NULL厅指针,因为放用顾if胆语句很容易污判断。但是姓“访野指针哪”庸是很危险的她,殖if坑语句对它不躬起作用。旁“盐野指针晴”需的成因主要屯有两种:咸(抱1忘)指针变量咬没有被初始淋化。任何指父针变量刚被猜创建时不会增自动成为胡NULL娃指针,它的重缺省值是随丙机的,它会厨乱指一气。圆所以,指针槽变量在创建构的同时应当垫被初始化,绸要么将指针普设置为末NULL蛾,要么让它趁指向合法的畅内存。例如腐char板*p=宪NULL;若char摔*str危=(ch浓ar*)宋mall虾oc(10段0);旁(厚2洗)指针喂p呀被毒free怨或者让delet耍e破之后,没有料置为难NULL必,让人误以广为认p卸是个合法的寸指针。根(爸3努)指针操作切超越了变量宵的作用范围剂。这种情况辅让人防不胜摘防,示例程怠序如下:写class穗A甚{钥publ仁ic:担voi该dFun死c(voi闻d){c狸out惨<<“枯Func厕ofcl洲assA座”<<胳endl;握}肚};患void下Test(怎void)村{巴A*p聪;折{焦A解a;匆p=季&倍a;//旗注意a郊的生命期末}怎p-邪>Func巷();/刊/p候是孟“删野指针劫”恢}陈函数益Test氧在执行语句吊p->Fu啊nc()筒时,对象贯a隔已经消失,竹而耗p护是指向公a旺的,所以势p典就成了傅“谢野指针叙”啊。但奇怪的穿是我运行这漆个程序时居蛇然没有出错巧,这可能与点编译器有关驳。耳6丙、有了俭mallo猫c/fre葛e损为什么还要绢new/d村elete处?剖毁mallo逮c收与仗free合是鸡C++/C饱语言的标准唐库函数,皇new/d巨elete切是叹C++惰的运算符。绝它们都可用畜于申请动态济内存和释放产内存。奥对于非蚂内部数据类尖型的对象而裹言,光用耀maloc钉/free慰无法满足动益态对象的要捆求。对象在棒创建的同时转要自动执行亿构造函数,烈对象在消亡弊之前要自动据执行析构函雷数。由于苍mallo别c/fre蓬e叨是库函数而打不是运算符膏,不在编译僚器控制权限纵之内,不能慨够把执行构沫造函数和析询构函数的任蒙务强加于仿mallo盾c/fre旨e之。召因此挥C++会语言需要一缠个能完成动沿态内存分配似和初始化工腿作的运算符亮new裹,以及一个饱能完成清理课与释放内存留工作的运算穷符游delet狡e护。注意蜜new/订delet活e姨不是库函数春。我们先看鸟一看讨mallo葬c/fre蠢e乓和声new/d难elete也如何实现对徒象的动态内源存管理,见峡示例禾6解。身class逢Obj游{晌publ婆ic:沫Obj元(void磁){co丢ut桑<<“办Initi游aliza蛇tion”温<<e汽ndl;川}袭~Ob皂j(voi严d){c愁out值<<“国Destr劈oy”<常<end百l;}常voi创dIni俊tiali狂ze(vo元id){屈cout携<<“恩Initi门aliza探tion”塘<<e产ndl;岩}旨voi冶dDes秘troy(纱void)尽{cou豆t雁<<“衔Destr湾oy”<添<end谦l;}竖};垦void浮UseMa歼llocF骆ree(v蓄oid)槽{钥Obj己*a=僵(obj需*)ma探lloc(症sizeo芹f(obj到));/摘/登申请动态内勇存突a-捡>Init臣ializ思e();邮//酿初始化皆//垫…趴a-妖>相Destr悠oy();印//清臭除工作勤划free(俭a);/例/析释放内存堂}优void贺UseNe佣wDele蹈te(vo害id)氧{仪悼Obj*巴a=n棚ewOb皇j;//菠逃申请动态内傍存并且初始柄化晓//戴…额dele裳te臂a;/谱/偏清除并且释宝放内存技}哑通示例捏6久用帮mallo梯c/fre夕e瑞和圆new/d旺elete凭如何实现对魔象的动态内各存管理止类属Obj稳的函数搜Initi仔alize构模拟了构造碌函数的功能洗,函数踩Destr趁oy虽模拟了析构贤函数的功能输。函数渗UseMa量llocF超ree妖中,由于鼓mall载oc/fr杂ee案不能执行构璃造函数与析方构函数,必猛须调用成员菊函数富Initi余alize叫和栗Destr厌oy捏来完成初始刺化与清除工阴作。函数叛UseN苏ewDel肤ete稻则简单得多隔。抢所以我订们不要企图冲用销mallo想c/fre粥e浸来完成动态咳对象的内存夏管理,应该论用宣new/d泥elete幻。由于内部朗数据类型的滴“愧对象些”良没有构造与花析构的过程青,对它们而泳言赠mallo足c/fre热e低和趟new/d稀elete名是等价的。苦既然匠new/d觉elete庙的功能完全燕覆盖了拌mallo踩c/fre厉e萄,为什么巧C++浮不把之mallo树c/fre引e鱼淘汰出局呢能?这是因为偶C++立程序经常要曲调用搜C展函数,而税C奥程序只能用项mallo忌c/fre革e篇管理动态内师存。钥如果用妖free匪释放骂“屠new许创建的动态闸对象相”只,那么该对颜象因无法执疮行析构函数费而可能导致针程序出错。痕如果用克delet排e饭释放纤“致mallo丝c宝申请的动态江内存共”姻,理论上讲构程序不会出循错,但是该音程序的可读猫性很差。所套以徐new/d呢elete卸必须配对使跪用,运mallo锁c/fre蜻e情也一样。膀拥7晒、内存耗尽辫怎么办?扔如果在申请西动态内存时吸找不到足够娃大的内存块嗽,显mallo勺c角和观new奥将返回奴NULL奉指针,宣告滨内存申请失矛败。通常有邀三种方式处漠理边“怀内存耗尽晚”事问题。咱掀滥叠(虽1座)判断指针汗是否为宝NU秘LL鬼,如果是则痛马上用清retur减n雨语句终止本扑函数。例如泡:邮void诚Func(沫void)咳{书A诞*a=概new溉A;粱if(a团==N传ULL)条{聋ret舒urn;繁}蒜末…苦}尤(菠2菜)判断指针脂是否为伸NULL贪,如果是则淋马上用重exit(笑1)提终止整个程婚序的运行。鼻例如:笛void银Func(浅void)枣{即A*a乞=胸new视A;政if(a樱==N织ULL)到{际cou孕t葛<<“衔Memor漫yExh衣auste漂d”<<颤endl课;亲exi生t(1);闷}弄骨…匹}嗽粘悦(娘3塘)为变new辩和拴mallo班c企设置异常处两理函数。例断如锁Visua侨lC++罪可以用碑_set_汤new_h井ander梦函数为衣new诱设置用户自幼己定义的异袭常处理函数蛛,也可以让吹mallo锄c桶享用与沈new杯相同的异常夫处理函数。锦详细内容请幼参考益C++金使用手册。馋上述(赴1否)(萌2绞)方式使用撤最普遍。如顺果一个函数去内有多处需稻要申请动态桑内存,那么墙方式(子1矛)就显得力口不从心(释冻放内存很麻芒烦),应该狡用方式(裁2办)来处理。热很多人樱不忍心用陆exit(纲1)触,问:查“铲不编写出错键处理程序,嫌让操作系统挽自己解决行流不行?答”温不行。极如果发生倾“睁内存耗尽诚”贷这样的事情扔,一般说来主应用程序已状经无药可救示。如果不用塑exit(固1)绸把坏程序杀幕死,它可能摧会害死操作意系统。道理闯如同:如果泡不把歹徒击钟毙,歹徒在阳老死之前会黎犯下更多的至罪。内有一个提很重要的现镰象要告诉大柳家。对于德32漫位以上的应拳用程序而言踢,无论怎样渠使用白mallo虽c姻与窃new土,几乎不可裹能导致日“驱内存耗尽矿”茄。我在鸭Windo酱ws夜98下用V昏isual秤C++圆编写了测试裙程序,见示堵例社7凤。这个程序遵会无休止地洪运行下去,奔根本不会终盆止。因为丢32咸位操作系统尾支持讯“街虚存饥”靠,内存用完梨了,自动用锋硬盘空间顶圣替。我只听惩到硬盘嘎吱宝嘎吱地响,胸Windo碑w98峡已经累得对希键盘、鼠标箩毫无反应。酬我可以霉得出这么一秤个结论:对柳于季32平位以上的应狱用程序,隆“拿内存耗尽皮”模错误处理程停序毫无用处艰。这下可把黑Unix专和元Windo链ws薄程序员们乐歇坏了:反正碰错误处理程常序不起作用卵,我就不写阵了,省了很位多麻烦。并我不想遣误导读者,早必须强调:书不加错误处拖理将导致程葬序的质量很旁差,千万不伴可因小失大泻。里void涉main(耽void)净{酷floa撤t驰*p=纸NULL浇;仁whil无e(TRU容E)桑{洁p=疫new阶float稻[1000伤000];赵cou资t孔<<“炊eatm胳emory忠”<<臭endl;候if(同p==NU罪LL)淋ex浙it(1)匆;块}垮}纠示例盏7崇试图耗尽操汪作系统的内岸存智兴届8仔、作mallo沸c/fre蔽e世的使用要点细函数刑mallo认c她的原型如下董:磨void棋*mal扭loc(s堂ize_t妇size陷);香用涂mallo侨c夺申请一块长疲度为贫lengt蛙h质的整数类型递的内存,程伐序如下:拣int*辫p=(大int*蜂)mal禾loc(s混izeof艇(int)谜*le容ngth)摆;格我们应咱当把注意力绣集中在两个尝要素上:狸“戏类型转换售”赵和贴“坊sizeo番f”骄。戚拆*mal校lo据c即返回值的类忌型是恨void锻*梳,所以在调喜用做mallo扫c裁时要显式地炮进行类型转肚换,将粒void遭*除转换成所需鸡要的指针类获型。编拜*mal扯loc腰函数本身并纠不识别要申轮请的内存是棍什么类型,昆它只关心内鼠存的总字节慧数。我们通誉常记不住衫int,誉float绝等数据类型迷的变量的确凤切字节数。谢例如访int贡变量在畏16铁位系统下是轮2痛个字节,在含32按位下是叮4邻个字节;而及float篮变量在谨16须位系统下是型4袜个字节,在易32触位下也是姓4杰个字节。最视好用以下程砌序作一次测两试:速cout魄<<si环zeof(登char)择<<e络ndl;站cout涛<<si只zeo愚f(int统)<<垫endl;叠cout裙<<si体zeof(友unsig损nedi锤nt)<秤<end梅l;俘cout杰<<si忆zeof(垒long)膝<<e颗ndl;芬cout倍<<si女zeof(给unsig染nedl男ong)南<<en苦dl;粱cout汽<<si挽zeof(肝float丰)<<壳endl;笨cout丽<<si蒙zeof(车doubl摇e)<<柏endl润;教cout暑<<si筛zeof(俯void枝*)<<赖endl聚;队在区mallo祝c桶的迈“秤()”马中使用族sizeo施f镜运算符是良诊好的风格,秋但要当心有庸时我们会昏相了头,写出旨p=喇mallo孔c(siz喝eof(p值))柱这样的程序疯来。牧贵*宰函数掏free个的原型如下刷:芝void呆free(矛void烈*me祥mbloc糖k);驴为什么闭free巴函数不象倚mallo棍c弹函数那样复援杂呢?这是登因为指针六p迫的类型以及师它所指的内雅存的容量事寻先都是知道姓的,语句桂free(夹p)腐能正确地
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 销售话术与沟通技巧训练培训
- 2024年设备监理师考试题库附答案【轻巧夺冠】
- 跨学科合作教学的实践探索计划
- 旅游行业前台员工工作心得
- 钢铁冶炼工艺创新
- 2024年设备监理师考试题库及答案(必刷)
- 2024年美术教案经典
- 分包采购合作协议(2篇)
- 2024年联通智家工程师(初级)认证理论备考试题库(附答案)
- 通关03 世界史选择题专练(原卷版)
- (高清版)TDT 1042-2013 土地整治工程施工监理规范
- 工程训练(广东工业大学)智慧树知到期末考试答案2024年
- 2023-2024学年重庆市九龙坡区高二(上)期末物理试卷(含解析)
- 初中数学九年级下册《位似》(1)教案
- 天全县储备林建设项目施工组织设计样本
- 矿权收储方案
- 2022-2023学年重庆市渝北区人教PEP版五年级上册期末英语试卷
- 安徽省合肥市庐江县2022-2023学年八年级上学期期末物理试卷(含答案)
- 造价年度工作总结
- 护理人员应急预案培训课件:居家病人护理与应急服务
- 液压与气动传动CAI第1章
评论
0/150
提交评论