C语言内存管理和内存泄漏课件.ppt

C语言内存管理和内存泄漏课件.ppt

ID:57057006

大小:63.00 KB

页数:21页

时间:2020-07-30

C语言内存管理和内存泄漏课件.ppt_第1页
C语言内存管理和内存泄漏课件.ppt_第2页
C语言内存管理和内存泄漏课件.ppt_第3页
C语言内存管理和内存泄漏课件.ppt_第4页
C语言内存管理和内存泄漏课件.ppt_第5页
资源描述:

《C语言内存管理和内存泄漏课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C/C++内存管理及内存泄漏C语言的内存管理静态储存区动态储存区(堆)栈区静态储存区“静态存储区”是放置全局变量,常量,静态变量的区域,在程序编译期间就已经定义,在程序加载到内存后被直接分配内存的。不会有内存泄漏发生。动态储存区“动态存储区”就是堆,是程序在运行期间分配的内存,比如用new,malloc等函数分配的内存,需要程序自己用delete,free去释放,也是容易出现内存泄漏的类型。栈区“栈”是在函数内的自动变量分配的存储区,包括函数的参数,函数的内部非静态变量的变量,它的分配由程序在运行到这个函数的时候才被CPU分配,并在退出这个函数的时候被释放

2、。(进入函数时,在堆栈分配内存,退出函数时把堆栈弹出)C++的内存管理全局/静态存储区常量存储区堆自由存储区栈全局/静态存储区全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。常量存储区这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改堆就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区就是那些由malloc等分配的

3、内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。栈就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。C++中对象的内存分配类中的静态成员变量分配在静态存储区,并且子类和父类的对象的静态变量使用同一个地址。如果类有虚函数,那么在对象内存的最开始要加上一个VFTable指针,这个指针指向静态存储区中的vtable,在32位操作系统中这个指针占4个字节。其他的成员变量依次占用对象的内存,父类的成员变量在前面。如果对象是全局变量,那么对象的内存在静态存储区,如果对象是函数局部变量,那么在

4、栈中分配,如果是new的对象,则在堆中分配。this指针不占存储空间,只是在发生函数调用的时候,使用ECX寄存器保持当前的this指针。C/C++动态内存分配C/C++中的动态内存分配一般用new和malloc等函数来分配。也就是在堆(或自由储存区)中分配。动态内存的分配必须由分配者自己手动释放分配的内存,否则就会产生内存泄漏。New的使用如果分配的不是数组(例如:struct,class等),直接调用delete释放内存。如果分配的是数组,那么要调用delete[]New和malloc的区别new是C++操作符,malloc是C函数。在C++中,如果ne

5、w的是一个类,那么new操作符自动调用类的构造函数,而malloc则只分配内存。new操作符暗含了sizeof,而malloc需要使用sizeof。Malloc需要用类型转换,而new不用。使用sizeof的必要性使用sizeof()可以屏蔽因为操作系统带来的内存分配不同,增加程序的可移植性。使用sizeof()可以自动计算一些不容易计算的类型大小,类如自定义的结构等,并且在修改类的定义后,不用修改使用sizeof的代码,增加程序的可维护性。使用new、malloc的注意点最好不要在循环里面,频繁的调用new/malloc,因为这样会造成动态存储区大量碎片

6、,从而影响系统性能。如果编写的是长期运行的服务程序,尽量避免动态内存的分配,除非确定是只分配一次,否则如果编码质量不高,即使有微小的内存泄漏,都会最后造成系统崩溃。编码的时候记住所有动态分配的内存和释放地点,最好在同一个函数内完成分配和释放。小结动态内存分配【规则1】用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。【规则2】不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。【规则3】动态内存的申请与释放必须配对,防止内存泄漏。【规则4】用free或delete释放了内存之后,立即将指针

7、设置为NULL,防止产生“野指针”。内存泄漏的几种情况new/malloc函数没有调用相应的函数释放内存。动态内存地址丢失首先释放父块函数内分配内存,在函数外要求释放的函数。析构函数没有定义成虚函数。小结内存泄漏始终要跟踪所有内存分配,并在任何适当的时候释放它们。尽量保证在本函数分配的动态内存在本函数内释放。对指针赋值时,要保证被赋值的指针没有指向其他的动态内存。释放一个结构体时,要先释放结构体的成员的指针。类的析构函数定义成虚函数,保证在多态的情况下也能正确的调用析构函数。查找内存泄漏的方法和工具程序方法在程序中加入语言支持的内存检查函数。例如:VC中的

8、“HeapStateReportingFunctions”,_Cr

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

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

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