




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
常见内存泄露及解决方案 选自 ood 启示录 new delete array new arrray delete 匹配 case 1 在类的构造函数与析构函数中没有匹配地调用 new delete 解决方法 检查构造函数 在出现 new 的情况下 按相反的顺序在析构函数中匹配添加 delete 这里有两个意思 1 new 与 delete 匹配 array new array delete 匹配 2 出现在前面的 new 要比出现在后面的 new 后匹配各自的 delete 比如 构造函数 m x new int 10 m y new CString 则析构函数 delete m y delete m x 对于基本数据类型 用 delete 也可以 但为了统一 还 是用 array delete case 2 没有正确地清除嵌套的对象指针 也就是说 某个对象以引用语义 指针 了包含另一个对象 而不是以值的方式 解决办法 1 养成好的成对编码习惯 在外部函数分配的堆内存 不要在调用函数里面释放 而在外部函数内释放 2 尽量在构造函数里面分配内存 并注意不要犯 case 1 错误 3 在基类 继承类各管各的内存 具体解析见下面的 case 8 for example include include Melon 甜瓜 西瓜 class Melon public Melon char var Melon void print void protected private char m variety Melon Melon char var m variety new char strlen var 1 strcpy m variety var Melon Melon delete m variety void Melon print std cout I m a m variety Melon n Meal 进餐 class Meal public Meal char var char res Meal void print void protected private char m reastaurant 饭店 Melon m pMelon 方法 2 Melon m Melon Meal Meal char var char res 方法 2 改引用为值包含 m Melon var m pMelon new Melon var m reastaurant new char strlen res 1 strcpy m reastaurant res Meal Meal delete m reastaurant delete m pMelon 修改方法 1 void Meal print std cout print 方法 2 m Melon print int main cout 对于单个对象 单个基本类型 如 int double 等 的变量 我们肯定采用 delete 不会出错 2 对于基本类型数组 由于不需要大小参数 因而 采用 delete 或 array delete delete 均可以 如上例中 我便直接采用了 delete m variety 建议为了统一 采用 delete m variety 3 对于自定义的对象所组成的对象数组 则一定要采用 array delete 这样编译器才会在释放内存前调用 每个对象的析构函数 并调用 free 释放对象数组空间 for example include include class Point public Point int x 0 int y 0 char col Red Point protected private int m x int m y char m color Point Point int x int y char col m x x m y y m color new char strlen col 1 strcpy m color col Point Point delete m color std cout In the deconstuctor of Point n int main int argc char argv cout case 3 n Point p new Point 5 delete p 正确方法 delete p return 0 case 4 指向由指向对象的指针构成的数组不等同于与对象数组 也就是说 数组的基本类型是指向对象的指针 此时 是用 delete 还是 delete array delete 并不重要 关键是指针并没有析构函数 必须用户自己调用 delete 语句 for example Point 类和 case 3 一样 int main int argc char argv cout case 4 n Point pPtrAry new Point 10 循环为每个指针分配一个 Point 对象 int i 0 for i 10 i pPtrAry i new Point i i Green 下面语句并没有释放 10 个 Point 对象 释放的只是他们的指针所组成的数组 占用的 10 sizeof Point 空间 造成了内存泄露 180 10 sizeof Point 10 6 6 sizeof Green delete pPtrAry 正确的方法 for i 0 i 拷贝构造函数编译器会自动阻止自己构造自己 比如 Point x x 出错 但是 赋值操作不会 Point x x 编译期不会出错 但运行期会出错 上面的错误原因在于 编译器虽然为 x 分配了内存 但调用拷贝构造函数时 m color 还没初始化 建议 尽量不要用这种方法初始化 以便将错误在编译期间显示出来 2 赋值运算符必须区别是否自身赋值 3 在赋值前必须释放原有 new 操作分配的资源 当然 其他文件等资源也要释放 这里只讨论内存溢出 略过不提 最后实现如下 const Point if this m y rhs m y 删除原有资源空间 必须牢记 delete m color m color new char strlen rhs m color 1 strcpy m color rhs m color return this 注意 最左边的 const 声明可以不要 要得话是为了阻止如下语句 x y z 但由于基本类型也支持 为了与基本类型一致 可以去掉 const 约束 case 7 关于 nonmodifying 运算符重载的常见错误 所谓 nonmodifying 运算符就是不改变操作数的值 并且返回结果类型与操作数一样 比如数学运算符 而关系运算符则不满足 因为其结果为 bool 型 赋值运算符也不是 利用 static 将临时变量作为类的内部存储单元 不足 不适合嵌套使用和多线程 比如 w x y z for example case 7 解决方法 1 static const Point temp m x this m x rhs m x temp m y this m y rhs m y 释放前一个值的资源 delete temp m color temp m color new char strlen this m color strlen rhs m color 1 sprintf temp m color s s this m color rhs m color return temp 注意 这里为了简单 并没有考虑类型转换 实际中二元运算符通常采用友元函数形式实现 具体判断方 法请看 Effective c Item 19 2 改引用语义为值语义 最好办法 但会降低效率 注意 有人也许会用指针方法 比如如下 Point temp new Point return temp 这样会产生一个无名对象 并且位于堆上 从而造成内存泄露 const Point Point operator const Point temp m x this m x rhs m x temp m y this m y rhs m y 释放前一个值的资源 delete temp m color temp m color new char strlen this m color strlen rhs m color 1 sprintf temp m color s s this m color rhs m color return temp case 8 没用将基类的析构函数定义成虚函数 解决方法 将基类的析构函数定义为虚函数 这种情况主要出现在下面情况 基类指针指向派生类 for example Apple is a kind of fruit and banana also is so someone write such codes Fruit basket 20 for int i 0 i 10 i basket i new Apple 输入水果信息 for i 20 i basket i new Banana 输入香蕉信息 如果 Fruitde 析构函数不是虚函数 则会造成内存溢出 假设 Apple 或 Banana 的构造函数中有 new 语句 否 则不会 for i 0 i 该错误
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婚礼策划与婚礼现场婚礼车队租赁合同
- 第12课 新时期的理论成果说课稿-2025-2026学年高中历史北师大版2010必修3-北师大版2010
- 安全举报培训心得课件
- 民政局离婚案件办理及后续法律跟踪服务合同
- 加拿大团聚担保合同范本
- 住房公积金按揭贷款支持新能源产业发展协议
- 名校教授特聘合同书-学术研究与教学服务
- 农业抵押贷款合同范本协议书
- 个性化离婚协议范本兼顾双方利益与子女成长
- 2025建筑材料供应承包合同
- 北京市西城区北京市第四中学2024-2025学年七年级上学期分班考数学试卷
- 【语文】第二单元《阅读综合实践》课件-2024-2025学年七年级语文上册(统编版2024)
- 《计算机应用基础项目教程》(赵国龙)764-1资源包-课件-项目一-计算机基础知识
- 堤溪沱江大桥特别重大坍塌事故工程伦理案例分析
- 【尿素生产中的热量衡算2400字】
- DL∕T 1684-2017 油浸式变压器(电抗器)状态检修导则
- 译林版初中单词表
- 新概念英语第二册第34课随堂练习
- 广东省广州市越秀区2025届高三数学上学期10月阶段测试试题
- NB-T10324-2019光伏发电站高电压穿越检测技术规程
- 广州初中7-9单词表
评论
0/150
提交评论