欢迎来到天天文库
浏览记录
ID:46747983
大小:80.00 KB
页数:6页
时间:2019-11-27
《浅谈C的内存管理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C++primer,effectiveC++,moreeffectivec++,exectionalC++,moreexceptionalC++,exceptionalC++style,theC++standardlibrary,effectivestl,modernc++design,C++template在谈述函数调用和返回值问题Z前,先来看看C++屮内存分配的问题。C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区以及常量区,动态数据区包括堆区和栈区。一下是各个区的
2、作用:(1)代码区:存放程序代码;(2)数据区a.静态数据区:在编译器进行编译的时候就为该变量分配的内存,即全局变量和静态变量(用static声明的变量),存放在这个区的数据程序全部执行结束后系统自动释放,声明周期贯穿于整个程序执行过程。b堆区:这部分存储空间完全由程序员自己负责管理,它的分配和释放都由程序员自己负责。这个区是唯一一个可以由程序员自己决定变量生存期的区间。可以用malloc,new申请对内存,并通过free和delete释放空间。如果程序员自己在堆区申请了空间,又忘记将这片内存释放掉,就会造成内存泄露的问题,导致后面一直无法访问这片存储区域。c栈区:存放函数的形式参
3、数和局部变量,由编译器分配和白动释放,函数执行完后,局部变量和形参占用的空I'可会自动被释放。效率比较高,但是分配的容量很有限。d常量区:存放常量的区间,如字符串常量等,注意在常量区存放的数据一旦经初始化后就不能被修改。在弄懂内存分配的问题过后,來看看函数调用的过程:执行某个函数时,如果有参数,则在栈上为形式参数分配空间(如果是引用类型的参数则类外),继续进入到函数体内部,如果遇到变量,则按情况为变量在不同的存储区域分趾空间(如果是static类型的变量,则是在进行编译的过程中已经就分配了空间),函数内的语句执行完后,如果函数没有返回值,则直接返回调用该函数的地方(即执行远点),如
4、果存在返冋值,则先将返冋值进行拷贝传冋,再返冋执行远点,函数全部执行完毕后,进行退栈操作,将刚才函数内部在栈上申请的内存空间释放掉。下面通过几个例子來谈谈内存分配和函数返冋值的问题:内存分配的问题:inta=l;a在栈区chars[]=”123”;s在栈区,“123”在栈区,其值可以被修改char*s=u123H;s在栈区,“123”在常量区,其值不能被修改int*p=newint;p在栈区,申请的空间在堆区(p指向的区域)int*p=(int*)malloc(sizeof(int));p在栈区,p指向的空间在堆区staticintb=0;b在静态区l.testl1#include
5、2usingnamespacestd;33voidgetMemory(char*str)4{5str=(char1碍3匸2血}:门注意先将传递过来的s进彳亍复制铐臾,6}门为m2在栈上分配空间后,将s的值賦给327//因肚用TUQ11OC在灌上申请空间后,S3是指向了3八堆上一个存储区域,但是s的值并役有发生改变10voidtest(void)11{12char*s=NULL;13getMemory(s);14strcpy(str,^rhelloworld!");15cout<6、0system(rrpsuerF);21return0;22}在运行过程中会报错,即程序发生崩溃,出现的原因就是函数用指针进行传递时,其实传递的也是一个值,也是将实参进行你给拷贝赋给形参,因此对形参的改变并不影响实参的值。2.test2#includeusingnamespacestd;char*test(uoid)charstr[]=llhelloworld";returnstr;intmain(uoid)char*p;p=test();cout<7、test函数内部声明的str•数组以及它的值“helloworld”是在栈上保存的,当用return将str的值返回时,将str的值拷贝一份传冋,当test函数执行结朿后,会自动释放栈上的空间,即存放helloworld的单元可能被重新写入数据,因此虽然main函数中的指针p是指向存放helloworld的单元,但是无法保证test函数执行完后该存储单元里面存放的还是helloworld,所以打印出的结果有时候是helloworld,有时候是乱麻,就是这种原因。2.t
6、0system(rrpsuerF);21return0;22}在运行过程中会报错,即程序发生崩溃,出现的原因就是函数用指针进行传递时,其实传递的也是一个值,也是将实参进行你给拷贝赋给形参,因此对形参的改变并不影响实参的值。2.test2#includeusingnamespacestd;char*test(uoid)charstr[]=llhelloworld";returnstr;intmain(uoid)char*p;p=test();cout<7、test函数内部声明的str•数组以及它的值“helloworld”是在栈上保存的,当用return将str的值返回时,将str的值拷贝一份传冋,当test函数执行结朿后,会自动释放栈上的空间,即存放helloworld的单元可能被重新写入数据,因此虽然main函数中的指针p是指向存放helloworld的单元,但是无法保证test函数执行完后该存储单元里面存放的还是helloworld,所以打印出的结果有时候是helloworld,有时候是乱麻,就是这种原因。2.t
7、test函数内部声明的str•数组以及它的值“helloworld”是在栈上保存的,当用return将str的值返回时,将str的值拷贝一份传冋,当test函数执行结朿后,会自动释放栈上的空间,即存放helloworld的单元可能被重新写入数据,因此虽然main函数中的指针p是指向存放helloworld的单元,但是无法保证test函数执行完后该存储单元里面存放的还是helloworld,所以打印出的结果有时候是helloworld,有时候是乱麻,就是这种原因。2.t
此文档下载收益归作者所有