C++的内存管理

C++的内存管理

ID:46283090

大小:75.00 KB

页数:4页

时间:2019-11-22

C++的内存管理_第1页
C++的内存管理_第2页
C++的内存管理_第3页
C++的内存管理_第4页
资源描述:

《C++的内存管理》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C++的内存管理这篇文章是我在学习高质量C++/C编程指南屮的第7章“内存管理”后的一篇笔记,之前我也写过相关的文章指针以及内存分配,但我感觉那篇还不是很好,这篇我很把它更完善一些一.内存的常见分配方式1.从静态区分配,一•般是全局变量和static类型变量2•从栈区分配内存厂•般是局部的变量,会随着所在函数的结束而自动释放3.从堆中分配,一般是使用手动分配,使用malloc()函数和new来巾请任意大小空间,不过要手动样放空间,相应的使用free()函数和delete释放,如果不释放该空I'可,而且指向该空间的指针指向了别的

2、空间.则该空间就无法禅放,造成内存泄露,造成了内存浪费二•内存的使用规则1•在使用malloc()或new申请空间时,要检查有没有分配空间成功,判断方法是判断指针是否为NULL,如屮请一块很大的内存而没有这么大的内存则分配内存会失败2.申请成功后最好是将该内存清空,使用memset()JFiZeroMemory()清空,不然存在垃圾而造成有时候输出很大乱码3.不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。(这句话不太理解)4.要防止数组或指针内存越界,5.申请内存成功后,使用结束后要释放,系统不会自动释放

3、手动分配的内存6.内存释放后,指针还是指向那块地址,不过这指针己经是“野指针“了,所以释放内存后指针要指向NULL,不然很危险,容易岀错,if()对野指针的判断不起作用三.指针和数组1.数组里的数据可以单个修改,但指针的不行,如我的例子,charstr[]「hello”,数组的大小冇6个字符(注意),可以通过str[O]=X修改了的个字符,而指针char*p=“Word"是指向了一串常量的字符串,常量字符串是不可修改的,如p[0]=X,编译器编译时不会保存,但执行时会出错2.内容的复制与比较内容的复制要使用strcpy()

4、函数不要使用赋值符”*内容的比较也是不要使用比较符号”二二”,使用strcmp()函数//数组…chara[]=,,hello,,;charb[10];strcpy(b,a);//不能用b=a;if(strcmp(b,a)==0)//不能用讦(b==a)//指针…intlen=strlen(a);char*p=(char*)malloc(sizeof(char)*(len+l));strcpy(p,a);//不要用P=a;if(strcmp(p,a)==0)//不要用if(p==a)3.计算空间的人小对数组的计算是使用size

5、of()函数,该函数会按照内存対齐的方式4的倍数计算,而指针的空间大小没法计算,只能记住在中请空间时的空间大小注意当数组作为函数的参数进行传递吋,该数组口动退化为同类型的指针,不论数组a的容量是多少,sizeof(a)始终等于sizeof(char*)voidFuncfchara[100]){cout«sizeof(a)«endl;//4字节而不是100字节}四.指针的内存的传递如果函数的参数是指针,则不要使用该参数來申请内存空间,这样没有实际的用处,而且这样当函数结束时还得不到释放内存而造成内存泄露这个问题可以使用”指针的指

6、针“的方法可以解决,不然使用返I叫指针地址的办法,先看一下使用“指针的指针”方法,还可以考虑一下引用使用返回内存地址的方法使用返回的方式传递内存地址容易出错的地方在于放回”栈内存”的指针,当GetMemoryf)函数结束时栈内存也被禅放,像这个代码char*GetString2(void){char*p="helloworld";returnp;}voidTest5(void){char*str=NULL;str=GetString2();cout«str«endl;}函数Test5运行虽然不会出错,但是函数GetString

7、2的设计概念却是错误的。因为GetString2内的“helloworld是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内存块。五•动态内存释放问题与野指针1.当我们使用free()和delete释放一块内存时,指针还是指向原来的地址,不过这时候的指针时野指针,可以验证一下.这图是我调试到if()语句吋的情况,p还没有指向NULL,只是释放了p指向的空间了执行的结果可以看看…所以有这样的一•些特征:1指针销毁了,并不表示所指的空间也得到了释放:内存泄

8、露2.内存被禅放了,并不表示指针也被销毁了或指向NULL:野指针7.malloc()/free()与new/delete的区别(摘抄原文)malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。b31.o

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。