boundscheckerBoundsChecker 怎么与VS2010集成到一起
boundschecker 时间:2021-06-20 阅读:(
)
怎样发现内存泄露?
如果你是用的VC或者VS的话,可以在程序最前面增加一段:
#ifdef _DEBUG
//for memory leak check
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define CheckMemoryLeak _CrtSetDbgFlag( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG )| _CRTDBG_LEAK_CHECK_DF)
#endif
然后在main函数的开头增加一段:
#ifdef _DEBUG
CheckMemoryLeak;
#endif
之后在程序运行完成之后调试窗口会显示有哪些块申请之后没有释放,也就是内存泄漏。
MFC初学,如图,请问这个程序的两处selectobject是做什么用的?只用一处可以么?谢谢
SelectObject的作用是将指定GDI对象选定进入指定的DC,并作为其绘画时使用的当前对象。
请仔细看下面这段话:
确保释放DC的时候DC中的各gdi对象都不是你自己创建的!!!!确保个gdi对象在释放的时候不被任何dc选中使用!!!!
假如我们要使用gdi函数画图,正确的步骤应该如下:
a.创建一个内存兼容dc(CreateCompatibleDC)
b.创建一个内存兼容bitmap(CreateCompatibleBitmap)
c.关联创建的内存兼容dc和bitmap(SelectObject)
d.画图
e.BitBlt到目的dc上
f.断开内存兼容dc和bitmap关联(SelectObject)
g.销毁内存兼容bitmap
h.销毁内存兼容dc
由于SelectObject在选入一个新的gdi对象的时候会返回一个原来的gdi对象(假如成功的话),所以需要在步骤c的时候保存返回值,在步骤f的时候当作入口参数使用.还有,步骤g和步骤h实际上顺序可以随意,因为他们两个此刻已经没有关系了,但是为了结构清晰,我建议按照 "先Create的后释放,后Create的先释放 "的原则进行.
关于步骤f,可能会有争议,因为即使省略这一步,步骤g和步骤h看起来照样可以返回一个成功的值.但实际上可能并没有执行成功,至少boundschecker会报告有错,错误信息大致是说,在释放dc的时候还包含有非默认的gdi对象,在释放gdi对象的时候又说这个gdi对象还被一个dc在使用.所以,我建议保留步骤f.为什么new/delete和new/delete必须配对使用
区别:
1. new/delete是C++里才有的,而new/delete与malloc/free一个显著的区别在于,new是建造一个对象,并调用对象的构造函数来初始化对象,其实在所有的new操作过程中,总是分为两步的:第一步是申请内存,第二步则是调用构造函数初始化对象。
同样,在调用delete的时候,需要先调用析构函数,然后在销毁堆内存。
2. new/delete通常来说是操作符,就是"+","-"一样。
3. new/delete是可以重载的,而重载之后,就成为了函数。
4. malloc在申请内存的时候,必须要提供申请的长度,而返回的指针是void*型,必须要强转才能成为需要的类型。
5. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。
6. C++默认的new/delete操作符内部,其实也调用了malloc/free这两个函数。
共同点:
1. 都必须配对使用,这里的配对使用,可不能理解为一个new/malloc就对应一个delete/free,而是指在作用域内,new/malloc所申请的内存,必须被有效释放,否则将会导致内存泄露,至于内存泄露的检查方法,我们推荐的工具是大家众所周知的BoundsChecker,至于如何使用BoundsChecker,我们将在以后撰文详解。
2. 都是申请内存,释放内存,free和delete可以释放NULL指针。
BoundsChecker 怎么与VS2010集成到一起
安装好BoundsChecker后,在VS工具栏有一个工具条,由于BoundsChecker使用插桩的方式,来查找内存泄露,所以需要在编译的时
候,来执行插桩操作,有一个开关,决定编译时是否使用BoundsChecker来插桩就是第五个,蓝色的图标,点中后,后面的编译条状态为有效,初始值
Error detection,表示查错,点击第一个红色的图标旁边的小箭头,弹出下拉菜单,选择Start with Error
Detection,开始插桩方式编译并调试运行。
过程中如果弹出有的窗口,需要你提供系统源文件如afxwin2.inl,thrdcore.cpp,
选择“取消“,因为我们不需要查找系统文件中的错。
随后会出现错误的源码位置,弹出一个标题上写了Program
Error Detected的错误框.如果暂时不改,点击右下解的Continue继续.
最后等到程序退出时,出现一个结果报告:
双击最顶上的Memory Leaks Detected,可以看到有哪些地文件出现了内存泄露.在红色的错误上面右键->Edit Source就可以修改了。
BoundsChecker适用于中小型代码量的项目.代码太多了,会很慢.比如在腾讯RTX的项目上使用(60~80万行代码),就基本用不了,太慢了.
UCloud优刻得近日针对全球大促活动进行了一次改版,这次改版更加优惠了,要比之前的优惠价格还要低一些,并且新增了1核心1G内存的快杰云服务器,2元/首年,47元/年,这个价格应该是目前市面上最低最便宜的云服务器产品了,有需要国内外便宜VPS云服务器的朋友可以关注一下。UCloud好不好,UCloud服务器怎么样?UCloud服务器值不值得购买UCloud是优刻得科技股份有限公司旗下拥有的云计算服...
触摸云国内IDC/ISP资质齐全商家,与香港公司联合运营, 已超8年运营 。本次为大家带来的是双12特惠活动,美国高防|美国大宽带买就可申请配置升档一级[CPU内存宽带流量选一]升档方式:CPU内存宽带流量任选其一,工单申请免费升级一档珠海触摸云科技有限公司官方网站:https://cmzi.com/可新购免费升档配置套餐:地区CPU内存带宽数据盘价格购买地址美国高防 1核 1G10M20G 26...
轻云互联成立于2018年的国人商家,广州轻云互联网络科技有限公司旗下品牌,主要从事VPS、虚拟主机等云计算产品业务,适合建站、新手上车的值得选择,香港三网直连(电信CN2GIA联通移动CN2直连);美国圣何塞(回程三网CN2GIA)线路,所有产品均采用KVM虚拟技术架构,高效售后保障,稳定多年,高性能可用,网络优质,为您的业务保驾护航。官方网站:点击进入广州轻云网络科技有限公司活动规则:用户购买任...
boundschecker为你推荐
bean是什么意思在jdbc的DAO是什么意思?还有bean?youtube创始人世界第一大网站是什么?网络视频下载器万能网络视频下载器 1.34怎么用国家法规数据库食品及食用农产品标准法规信息支撑和综合应用平台/食品安全标准与技术法规动态比对数据库如何查询标准公众号付费阅读目前公众号有没有的付费问答平台可以提供的?刷ip流量请问刷流量刷IP有什么用的!java程序员招聘为什么Java程序员工资都很高彩信平台请问彩信平台升级怎么改参数能告诉我具体步骤吗?西安娱乐西安市最刺激好玩的娱乐场所是哪里?driversbackup电脑里有个“Backup”文件夹是干什么的
贝锐花生壳域名 漂亮qq空间 香港bgp机房 谷歌香港 轻博 服务器cpu性能排行 铁通流量查询 申请个人网站 刀片式服务器 免费mysql数据库 架设邮件服务器 东莞服务器托管 西安主机 日本代理ip 服务器论坛 杭州电信宽带 北京主机托管 谷歌搜索打不开 学生机 空间排行榜 更多