“雷区”——内存管理

来源:互联网 发布:1hhh域名升级访问升级 编辑:程序博客网 时间:2024/05/16 08:31

3种内存分配形式:

(1)从静态存储区分配。内存在程序编译的时候就已经分配好了(已经编地址),这些内存在程序的整个运行期间都存在。

(2)在堆栈上分配。函数执行期间,函数内局部变量(包括形参)的存储单元都创建在堆栈上,函数结束时这些存储单元自动释放(堆栈清退)。

(3)从堆(heap)或自由存储空间上分配,亦称动态内存分配。程序在运行期间用malloc()或new申请任意数量的内存,程序员自己掌握内存的释放时机(free()或delete).


原则:如果使用堆栈存储和静态存储能够满足应用要求,就不要使用动态存储。


常见内存错误:

(1)内存分配未成功,却使用了它;(补习操作系统内存管理模块知识)

解决办法:在使用内存之前检查指针是否为NULL。如果指针p是函数的参数,那么在函数的入口处使用assert(p!=NULL)进行检查以避免输入非法参数。如果使用malloc()或new来申请内存,应该用if(p==NULL)、if(p!=NULL)或者捕获异常来进行错误处理。

(2)内存分配成功,但没有初始化。

解决办法:赋初值

(3)内存分配成功并初始化,但操作越过内存的边界。

(4)忘记了释放内存或者只释放了部分内存,造成内存泄漏。

解决办法:保证动态内存的申请和释放必须配对。

(5)释放了内存却还在使用它,以下几种情况:

@程序中的对象调用关系过于复杂,难以搞清楚某个对象是否已经被释放,此时应该重新设计数据结构,从根本上解决对象管理的混乱局面;

@函数的return语句写错,注意不能返回指向“栈内存”的指针或者引用,因为该内存在函数结束时被自动释放;

@使用free()或delete释放内存后,没有将指针设置为NULL,产生“野指针”;

@多次释放同一块内存。







原创粉丝点击