内存管理中常见的问题
2015-08-08 17:16
274 查看
1、分配方式:3种从静态存储区域分配、在堆栈上分配和动态内存分配。
2、动态分配内存的缺点:
动态分配内存时有可能产生内存碎片;
如果动态分配内存失败,需要检查返回值或者捕获异常;
动态创建的对象可能被删除多次或者删除后还继续被使用,发生运行时的错误或者程序耗内存现象。
3、常见的内存错误:
内存泄露:通常是指堆内存泄露,内存在堆上分配后,如果不使用需要立即进行释放。在C/C++中不会自动回收不再使用的内存。
内存越界访问:分为两种,一种是读越界,即读取了不属于自己的内存区域。如果区域无效,则程序立即崩溃。若有效可能导致不可预料的后果;另一种是写越界,也成为缓冲区溢出。
野指针:指不可用区域的指针,一般释放内存后,立即把指针设为空值来避免产生野指针。
虽然内存分配未成功,但内存已经被使用。一般需要添加防错处理。
内存分配成功,但尚未初始化内存就使用。
返回临时变量的指针。栈里边的变量都是临时的,当函数执行完时,相关的临时变量和参数就被清除了,不允许将临时变量的指针返回给调用者。
试图修改常量。
误解传值和传引用。
3、new()/delete()和malloc()/free()区别:
前者是C++的运算符,后者是C++/C语言的标准库函数;
对于非内部数据类型的对象,仅仅使用后者是不能满足动态对象的要求。
2、动态分配内存的缺点:
动态分配内存时有可能产生内存碎片;
如果动态分配内存失败,需要检查返回值或者捕获异常;
动态创建的对象可能被删除多次或者删除后还继续被使用,发生运行时的错误或者程序耗内存现象。
3、常见的内存错误:
内存泄露:通常是指堆内存泄露,内存在堆上分配后,如果不使用需要立即进行释放。在C/C++中不会自动回收不再使用的内存。
内存越界访问:分为两种,一种是读越界,即读取了不属于自己的内存区域。如果区域无效,则程序立即崩溃。若有效可能导致不可预料的后果;另一种是写越界,也成为缓冲区溢出。
野指针:指不可用区域的指针,一般释放内存后,立即把指针设为空值来避免产生野指针。
虽然内存分配未成功,但内存已经被使用。一般需要添加防错处理。
内存分配成功,但尚未初始化内存就使用。
返回临时变量的指针。栈里边的变量都是临时的,当函数执行完时,相关的临时变量和参数就被清除了,不允许将临时变量的指针返回给调用者。
试图修改常量。
误解传值和传引用。
3、new()/delete()和malloc()/free()区别:
前者是C++的运算符,后者是C++/C语言的标准库函数;
对于非内部数据类型的对象,仅仅使用后者是不能满足动态对象的要求。
相关文章推荐
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- Lua的内存管理浅析
- XP/win2003下发现1G的内存比512M还慢的解决方法
- PowerShell实现动态获取当前脚本运行时消耗的内存
- C#实现把dgv里的数据完整的复制到一张内存表的方法
- SQL语句实现查询SQL Server内存使用状况
- C语言内存对齐实例详解
- 解析C语言中位字段内存分配的问题
- 全局变量与局部变量在内存中的区别详细解析
- VB读取线程、句柄及写入内存的API代码实例
- php运行提示:Fatal error Allowed memory size内存不足的解决方法
- C#字符串内存分配与驻留池学习分享
- IE浏览器IFrame对象内存不释放问题解决方法
- C#之CLR内存深入分析
- JavaScript 变量、作用域及内存
- JavaScript避免内存泄露及内存管理技巧
- 基于C++内存分配、函数调用与返回值的深入分析
- c++实现逐行读取配置文件写入内存的示例