有没有好的办法试验是否存在内存泄漏?

phommy 2014-11-21 10:01:02
听说某些情况下,如果手工+=了事件但不做-=会造成内存泄漏,想知道以下代码是不是属于这类情况,要怎么测试呢?



void btnExit_Click(object sender, EventArgs e)
{
var frm = new ConfirmForm(this);
using (frm)
{
frm.ShowDialog();
frm.Disposed += frm_Disposed; //想测试如果手动+=了事件但不做-=会不会造成内存泄漏,要如何做?
}
Close();
}

void frm_Disposed(object sender, EventArgs e) { MessageBox.Show("disposed"); }
...全文
114 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390662973?page=1#post-396278904 测试时,不需要一开始就针对具体的子控件、组件、对象进行测试。例如我们可以先把一个窗体放入“内存溢出测试”,然后如果这个窗体在使用完毕20秒钟还没有被GC回收,我们才需要仔细看这个窗体里边有什么需要检测的。往往此时不需要再写测试,而用肉眼就能发现有问题的语句了。
winnowc 2014-11-21
  • 打赏
  • 举报
回复
这种造成内存泄漏的原因是delegate内部引用了方法所在的对象(Delegate类里面的_target变量),当然如果是匿名方法引用了外部变量,那还会生成一个类来维持这些引用(闭包)。 如果事件的提供方是一个长时间存在的对象,而事件的使用方生命周期比较短,并且数量会持续增加。如果它把自己挂到长时间存在的提供方上,就无法被回收了。所以这种情况下需要及时移除delegate,把引用链断开。 首先自己每次写+=的时候要考虑清楚双方的生命周期,知道+=是相当于把this添加到了提供方里。如果这个自己考虑不清楚,用工具检测有点麻烦,工具可以帮忙追踪托管对象的创建和释放,然后进行多次快照(快照时会进行完整GC),比较快照之间的变化,在GC后还存活的对象里面找自己认为应该已经释放,但是仍然存在的东西。最后可以按引用链查找被引用的原因。 这里这里是两个.net上的memory profiler工具检查内存泄漏的教程。微软也有简单点的CLRProfiler做同样的事情。
敌敌畏耶 2014-11-21
  • 打赏
  • 举报
回复

var frm = new ConfirmForm(this);
            while (true)
            {
                frm.Disposed +=this.frm_Disposed; 
                Thread.sleep(5);
            }
软件编程规范培训实例与练习 软件编程规范培训实例与练习  问题分类 1 逻辑类问题(A类)-指设计、编码中出现的计算正确性和一致性、程序逻辑控制等方面出现的问题,在系统中起关键作用,将导致软件死机、功能正常实现等严重问题; 接口类问题(B类)-指设计、编码中出现的函数和环境、其他函数、全局/局部变量或数据变量之间的数据/控制传输不匹配的问题,在系统中起重要作用,将导致模块间配合失效等严重问题; 维护类问题(C类)-指设计、编码中出现的对软件系统的维护方便程度造成影响的问题,在系统中不起关键作用,但对系统后期维护造成不便或导致维护费用上升; 可测试性问题(D类)-指设计、编码中因考虑不周而导致后期系统可测试性差的问题。  处罚办法 问题发生率: P=D/S D=DA+0.5DB+0.25DC 其中: P -问题发生率 D -1个季度内错误总数 DA -1个季度内A类错误总数 DB -1个季度内B类错误总数 DC -1个季度内C类错误总数 S -1个季度内收到问题报告单总数 1)当D≥3时,如果P≥3%,将进行警告处理,并予以公告; 2)当D≥5时,如果P≥5%,将进行罚款处理,并予以公告。 目 录 一、逻辑类代码问题 第5页 1、变量/指针在使用前就必须初始化 第5页 【案例1.1.1】 第5页 2、防止指针/数组操作越界 第5页 【案例1.2.1】 第5页 【案例1.2.2】 第6页 【案例1.2.3】 第7页 【案例1.2.4】 第8页 3、避免指针的非法引用 第9页 【案例1.3.1】 第9页 4、变量类型定义错误 第10页 【案例1.4.1】 第10页 5、正确使用逻辑与&&、屏蔽&操作符 第17页 【案例1.5.1】 第17页 6、注意数据类型的匹配 第18页 【案例1.6.1】 第18页 【案例1.6.2】 第18页 7、用于控制条件转移的表达式及取值范围是否书写正确 第20页 【案例1.7.1】 第20页 【案例1.7.2】 第21页 【案例1.7.3】 第22页 8、条件分支处理是否有遗漏 第24页 【案例1.8.1】 第24页 9、引用已释放的资源 第26页 【案例1.9.1】 第26页 10、分配资源是否已正确释放 第28页 【案例1.10.1】 第28页 【案例1.10.2】 第29页 【案例1.10.3】 第30页 【案例1.10.4】 第32页 【案例1.10.5】 第33页 【案例1.10.6】 第35页 【案例1.10.7】 第38页 11、防止资源的重复释放 第39页 【案例1.11.1】 第39页 12、公共资源的互斥性和竞用性 第40页 【案例1.12.1】 第40页 【案例1.12.2】 第40页 二、接口类代码问题 第43页 1、对函数参数进行有效性检查 第43页 【案例2.1.1】 第43页 【案例2.1.2】 第43页 【案例2.1.3】 第44页 【案例2.1.4】 第46页 【案例2.1.5】 第47页 【案例2.1.6】 第48页 2、注意多出口函数的处理 第49页 【案例2.2.1】 第49页 三、维护类代码问题 第51页 1、 统一枚举类型的使用 第51页 【案例3.1.1】 第51页 2、 注释量至少占代码总量的20% 第51页 【案例3.2.1】对XXX产品BAM某版本部分代码注释量的统计 第51页 四、产品兼容性问题 第52页 1、系统配置、命令方式 第52页 【案例4.1.1】 第52页 【案例4.1.2】 第53页 2、设备对接 第54页 【案例4.2.1】 第54页 3、其他 第55页 【案例4.3.1】 第55页 五、版本控制问题 第58页 1、新老代码中同一全局变量不一致 第58页 【案例5.1.1】 第58页 六、可测试性代码问题 第59页 1、调试信息/打印信息的正确性 第59页 【案例6.1.1】 第59页 一、逻辑类代码问题 1、变量/指针在使用前就必须初始化 【案例1.1.1】 C语言中最大的特色就是指针。指针的使用具有很强的技巧性和灵活性,但同时也带来了很大的危险性。在XXX的代码中有如下一端对指针的灵活使用: ... ... _UC *puc_card_config_tab; ... ... Get_Config_Table(
一套功能强大,可取代记事本的文字编辑器,拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴簿的功能,能够同步于剪贴簿自动将文字贴进 EditPlus 的编辑窗口中,让你省去做贴上的步骤。另外它也是一个好用的 HTML 编辑器,除了可以颜色标记 HTML Tag (同时支持 C/C++、Perl、Java) 外,还内建完整的 HTML 和 CSS1 指令功能,对于习惯用记事本编辑网页的朋友,它可帮你节省一半以上的网页制作时间,若你有安装 IE 3.0 以上版本,它还会结合 IE 浏览器于 EditPlus 窗口中,让你可以直接预览编辑好的网页 (若没安装 IE,也可指定浏览器路径)。   v3.41 (2012-05-03)   <功能>   * 支持 Zen Coding   * ‘保留本地副本' FTP 选项 ('FTP 设置'->’高级选项‘)   * 在目录窗口新增 ’文件名搜索‘ 命令   * 在工程对话框新增 Ctags 种类选项   * ’运行为文本过滤器 (复制结果)‘ 用户工具选项   * 右键菜单命令允许使用 SHIFT 键展开菜单   * ’转到定义‘ 命令现在也在候选列表显示文件名   * 允许选择工程 INI 文件 (’管理工程‘->’工程 INI 文件‘)   * 工具栏按钮 ’更多最近的文件‘   <错误修正>   * 拆分窗口导致程序崩溃   * TR1 正则表达式错误导致内存泄露   * 粘贴命令不工作, 如果剪贴板文本为不可用的 Unicode   * 如果路径包含 '.', 则 .txt 文件扩展名不能被自动追加   * 文字加亮不能在拆分窗格进行加亮   * 如果出现多个候选, 则 ’转到定义‘ 不能正确工作   * 如果有两个函数参数, 则 ’下一函数‘ 命令会出错   关于简体中文版   ==========   * 修正:'工具'->'设置目录' 的按钮排列问题。感谢 hdzz [0504]   * 修正:汉化了几个以前不能动的单词(比如 Text 和 Default)而不会导致软件BUG [0503]   * 修正:当另存为时,在文件名称输入框的鼠标右键菜单问题 [0501]   (完美解决方案,真正中文,不会再调出来韩文了。感谢 D4llower 等多位网友协力帮助)   * 修正:在 64 位系统下,无法设置系统右键快捷菜单关联 [0501]   * 修正: 当 "另存为"、并在文件名称输入框点击鼠标右键时, 弹出英文菜单的问题 (详见下) [0427]   * 修正: 参数设置素材目录一处翻译错误 [0315]   * 修正: '首选项'->'常规' 的 '使用 TR1 正则表达式' 选项显示位置不正确的问题 [1014]   * 修正: FTP 设置对话框布局的问题 [0907]   * 修正: 不能定义颜色的问题 [0828]   * 更新: 许可协议汉化 [0612]   * 修正: “文档”菜单中的“文件多编码方式”根据意译修改为“批量更改文件编码”,感谢 liuyan814 [0610]   * 修正: 字符统计功能不准确的问题,感谢 liuyan814 [0610]   * 新增: Liangjh 的 Tips.txt 文件,感谢 Liangjh   * 新增: python 语法着色模板   关于“另存为”右键菜单问题的重要说明   EditPlus 3.21.761 之后的版本,与之前的版本在程序设计上有较大的改变!按照之前的汉化和解决方法,已经不能完美解决问题!比如使用新版本打开一个文本文件,当“另存为”、并在文件名输入框里点鼠标右键时,右键菜单为英文。好多网友反反馈认为没有汉化完整,其实这和汉化完全无关,该资源根本不在 EditPlus 所附带的任何一个文件里。原因是主程序调用系统资源文件 comctl32.dll 的方式改变了,英文版只读取英文资源(基于英文版的汉化版当然也一样)。经过反复模索和试验,终于找到了解决办法
一套功能强大,可取代记事本的文字编辑器,拥有无限制的 Undo/Redo、英文拼字检查、自动换行、列数标记、搜寻取代、同时编辑多文件、全屏幕浏览功能。而它还有一个好用的功能,就是它有监视剪贴簿的功能,能够同步于剪贴簿自动将文字贴进 EditPlus 的编辑窗口中,让你省去做贴上的步骤。另外它也是一个好用的 HTML 编辑器,除了可以颜色标记 HTML Tag (同时支持 C/C++、Perl、Java) 外,还内建完整的 HTML 和 CSS1 指令功能,对于习惯用记事本编辑网页的朋友,它可帮你节省一半以上的网页制作时间,若你有安装 IE 3.0 以上版本,它还会结合 IE 浏览器于 EditPlus 窗口中,让你可以直接预览编辑好的网页 (若没安装 IE,也可指定浏览器路径)。 版本 3.40 (2012-03-01) <功能> * 支持 Ctags ('搜索'->'Ctags') * 在查找对话框的“即打即找”选项 * HTML5 和 CSS3 语法加亮 * 在“首选项”->“颜色”对话框的“导入/导出”按钮 * 在文档选择器标签显示关闭按钮 * FTP 上传对话框允许选择多重站点 * FTP 选项“上传为临时文件, 然后改名” * SOCKS5 代理选项 * 目录窗口支持 CHMOD 命令 * “使用 TortoiseGit”菜单选项 (“文件”->“TortoiseSVN”) * “搜索”->“搜索 Web”菜单命令 * 拆分窗格具有独立滚动条 * 替换对话框“列表”按钮 * “标志列表”命令 (“搜索”->“标志”) * 目录窗口的“关联菜单”命令 * “同步滚动”菜单选项 (“窗口”->“其它”) * 在“在文件中查找”对话框的“在新文档中显示结果” * “放大工具栏按钮”选项 (“首选项”->“工具”) * “查找”->“空白字符”->“所有”命令 * 改进“删除重复的行”速度 * 允许排序“Web 服务器根目录”设置 * “行注释缩进”工具栏按钮 * “禁用字体平滑边缘”选项 (“首选项”->“字体”) * “忽略行注释”代码折叠选项 (“查看”->“代码折叠”) * “保持目录结构”备份选项 <错误修正> * 一些 FTP 服务器会导致程序崩溃 * 过长的 FTP 广告文字会导致程序崩溃 * “在文件中查找”命令会导致内存泄漏 * “停止”命令在输出窗口不工作 (某些程序) * 如果出现多重密钥, 则“使用 Pageant”选项会失败 * FTP 无法打开名称中含有空格的文件 * 修正目录窗口排序问题 (按本国 Windows 语言) * 行注释的代码折叠不能正确地工作 * 修正 FTP 下载进度指示器错误 * 修正在某些网络驱动器中的“文件被修改”警告错误 * 修正无效的“TortoiseSVN 未找到”错误 * 在素材窗口的“刷新”命令不工作 * 修正 CSS 数字语法加亮 * 单词加亮不能处理 Tab 字符 * 如果任务栏在左侧, 窗口位置可能错误地还原 * FTP 目录缓存不区分大小写 关于简体中文版 ========== * 修正:'文件' -> '其他' -> '打开标头' 为 '打开头文件' 等8处菜单词语。感谢 阿Q [0312] * 修正:ansi.ctl 特殊字符在“素材”窗口无法显示等问题。感谢 阿Q [0312] * 修正:'工具'->'设置目录' 的按钮排列问题。感谢 hdzz [0504] * 修正:汉化了几个以前不能动的单词(比如 Text 和 Default)而不会导致软件BUG [0503] * 修正:当另存为时,在文件名称输入框的鼠标右键菜单问题 [0501] (完美解决方案,真正中文,不会再调出来韩文了。感谢 D4llower 等多位网友协力帮助) * 修正:在 64 位系统下,无法设置系统右键快捷菜单关联 [0501] * 修正: 当 "另存为"、并在文件名称输入框点击鼠标右键时, 弹出英文菜单的问题 (详见下) [0427] * 修正: 参数设置素材目录一处翻译错误 [0315] * 修正: '首选项'->'常规' 的 '使用 TR1 正则表达式' 选项显示位置不正确的问题 [1014] * 修正: FTP 设置对话框布局的问题 [0907] * 修正: 不能定义颜色的问题 [0828] * 更新: 许可协议汉化 [0612] * 修正: “文档”菜单中的“文件多编码方式”根据意译修改为“批量更改文件编码”,感谢 liuyan814 [0610] * 修正: 字符统计功能不准确的问题,感谢 liuyan814 [0610] * 新增: Liangjh 的 Tips.txt 文件,感谢 Liangjh * 新增: python 语法着色模板 关于“另存为”右键菜单问题的重要说明 EditPlus 3.21.761 之后的版本,与之前的版本在程序设计上有较大的改变!按照之前的汉化和解决方法,已经不能完美解决问题!比如使用新版本打开一个文本文件,当“另存为”、并在文件名输入框里点鼠标右键时,右键菜单为英文。好多网友反反馈认为没有汉化完整,其实这和汉化完全无关,该资源根本不在 EditPlus 所附带的任何一个文件里。原因是主程序调用系统资源文件 comctl32.dll 的方式改变了,英文版只读取英文资源(基于英文版的汉化版当然也一样)。经过反复模索和试验,终于找到了解决办法!-- [0501] 以后的版本均采用此完美解决方法。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧