博文

VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏(2010-05-08 16:06:00)

摘要:VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏 作者:JerryZ   最近看了周星星 Blog 中的一篇文章:“VC++6.0 中内存泄漏检测”,受益匪浅,便运行其例子代码想看看 Output 窗口中的输出结果,可惜怎么弄其输出都不是预期的东西,郁闷了半天,便到水坛里找到周星星,请求他指点一、二,然而未果。没有办法,最后我一头栽进 MSDN 库狂搜了一把,功夫不负有心人,我搜出很多有关这方面的资料,没过多久我便基本上就找到了答案......   首先,检测内存泄漏的基本工具是调试器和 CRT 调试堆函数。为了使用调试堆函数,必须在要检测内存泄漏和调试的程序中添加下面的语句: #define _CRTDBG_MAP_ALLOC #include #include #include "debug_new.h"   MSDN 如是说:“必须保证上面声明的顺序,如果改变了顺序,可能不能正常工作。”至于这是为什么,我们不得而知。MS 的老大们经常这样故弄玄虚。   针对非 MFC 程序,再加上周星星的头文件:debug_new.h,当然如果不加这一句,也能检测出内存泄漏,但是你无法确定在哪个源程序文件中发生泄漏。 Output 输出只告诉你在 crtsdb.h 中的某个地方有内存泄漏。我测试时 REG_DEBUG_NEW 没有起作用。加不加这个宏都可以检测出发生内存分配泄漏的文件。   其次,一旦添加了上面的声明,你就可以通过在程序中加入下面的代码来报告内存泄漏信息了: _CrtDumpMemoryLeaks();   这就这么简单。我在周星星的例子代码中加入这些机关后,在 VC++ 调试会话(按 F5 调试运行) Output 窗口的 Debug 页便看到了预期的内存泄漏 dump。该 dump 形式如下: Detected memory leaks! Dumping objects -> c:\Program Files\...\include\crtdbg.h(552) : {45} normal block at 0x00441BA0, 2 bytes long. Data: 41 42 c:\Program Files\...\include\crt......

阅读全文(1250) | 评论:0

[转]VC使用CRT调试功能来检测内存泄漏(2010-05-08 14:35:00)

摘要: 来源:http://pcedu.pconline.com.cn/empolder/gj/vc/0506/648575_1.html C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话。在 C/C++ 应用程序开发过程中,动态分配的内存处理不当是最常见的问题。其中,最难捉摸也最难检测的错误之一就是内存泄漏,即未能正确释放以前分配的内存的错误。偶尔发生的少量内存泄漏可能不会引起我们的注意,但泄漏大量内存的程序或泄漏日益增多的程序可能会表现出各种 各样的征兆:从性能不良(并且逐渐降低)到内存完全耗尽。更糟的是,泄漏的程序可能会用掉太多内存,导致另外一个程序垮掉,而使用户无从查找问题的真正根源。此外,即使无害的内存泄漏也可能殃及池鱼。   幸运的是,Visual Studio 调试器和 C 运行时 (CRT) 库为我们提供了检测和识别内存泄漏的有效方法。下面请和我一起分享收获——如何使用 CRT 调试功能来检测内存泄漏? 一、如何启用内存泄漏检测机制   VC++ IDE 的默认状态是没有启用内存泄漏检测机制的,也就是说即使某段代码有内存泄漏,调试会话的 Output 窗口的 Debug 页不会输出有关内存泄漏信息。你必须设定两个最基本的机关来启用内存泄漏检测机制。   一是使用调试堆函数: #define _CRTDBG_MAP_ALLOC #include #include   注意:#include 语句的顺序。如果更改此顺序,所使用的函数可能无法正确工作。   通过包含 crtdbg.h 头文件,可以将 malloc 和 free 函数映射到其“调试”版本 _malloc_dbg 和 _free_dbg,这些函数会跟踪内存分配和释放。此映射只在调试(Debug)版本(也就是要定义 _DEBUG)中有效。发行版本(Release)使用普通的 malloc 和 free 函数。#define 语句将 CRT 堆函数的基础版本映射到对应的“调试”版本。该语句不是必须的,但如果没有该语句,那么有关内存泄漏的信息会不全。   二是在需要检测内存泄漏的地方添加下面这条语句来输出内存泄漏信息:......

阅读全文(1114) | 评论:0

IE里的探索(2010-05-08 13:55:00)

摘要:IE里的探索 青苹果工作室编译    Microsoft公司的 Internet Explorer已经成为我们机器中必备的工具,只要一打开计算机,只要一上网,怎么会不双击那熟悉的E图标?但是我们对它的了解也许只停留在冰山一角的程度,我们希望添加、定制特殊的功能,以实现更加实用、更加强大的功能。本文就将全面介绍关于IE的高级定制功能,让我们更加充分地发挥其作用!   本文包括如下各节: * 浏览器概览 * 向标准上下文相关菜单里添加条目 * 添加浏览器栏 * 添加工具条按钮 * 创建具有良好行为的自定义元素 * 定制浏览器好助手-BHO(上) * 定制浏览器好助手-BHO(中) * 定制浏览器好助手-BHO(下) 链接:http://tech.china.com/zh_cn/netschool/softwares/ie/628/20010306/01.html......

阅读全文(1301) | 评论:0

TCHAR* 转 CString(2010-05-07 18:00:00)

摘要:简单随笔。。。。。 TCHAR* pTmp = L"dfdskfjlsdjfjdlfjlsdkjfsdjf"; CString str(pTmp);......

阅读全文(3163) | 评论:0

vs2005 的删除类和删除函数的方法(2010-05-07 17:11:00)

摘要:随笔。。。。。 1.删除类: 在解决方案视图,选中类所对应的文件,按键盘delelte,然后保存工程编译RebuildAll。就会把该类删掉。 2.删除函数: 在.h和.cpp文件文件中注释掉即可,重新开一次VS2005后类视图中就不会显示出一删除的函数名称了。......

阅读全文(3343) | 评论:1

TCHAR 转换为char(2010-05-07 16:31:00)

摘要:void Wide2Bytes(char* pBytes,TCHAR* pWide) {          int nLen = WideCharToMultiByte(CP_ACP,0,pWide,-1,NULL,0,NULL,NULL);          // get need convert length           int i = (int)wcslen(pWide)*sizeof(TCHAR);           // get need new memory size            pBytes = new char[i+1];            if (!pBytes) // if fail then new again            {                     pBytes = new char[i+1];            }            if(!pBytes) { return; }     ......

阅读全文(6728) | 评论:0

数据库编程总结[续](2010-04-21 20:11:00)

摘要:存储过程编写经验和优化措施   一)、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。     二)、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇到优化的问题,否则速度有可能很慢,经过亲身经验,一个经过优化过的SP要比一个性能差的SP的效率甚至高几百倍。     三)、内容:     1、开发人员如果用到其他库的Table或View,务必在当前库中建立View来实现跨库操作,最好不要直接使用“databse.dbo.table_name”,因为sp_depends不能显示出该SP所使用的跨库table或view,不方便校验。     2、开发人员在提交SP前,必须已经使用set showplan on分析过查询计划,做过自身的查询优化检查。 3、高程序运行效率,优化应用程序,在SP编写过程中应该注意以下几点:      a)SQL的使用规范:    i. 尽量避免大事务操作,慎用holdlock子句,提高系统并发能力。    ii. 尽量避免反复访问同一张或几张表,尤其是数据量较大的表,可以考虑先根据条件提取数据到临时表中,然后再做连接。    iii. 尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该改写;如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。    iv. 注意where字句写法,必须考虑语句顺序,应该根据索引顺序、范围大小来确定条件子句的前后顺序,尽可能的让字段顺序与索引顺序相一致,范围从大到小。    v. 不要在where子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。    vi. 尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。    vii. 尽量使用“>=”,不要使用“>”。 ......

阅读全文(1320) | 评论:0

数据库编程总结(2010-04-21 20:10:00)

摘要:数据库编程总结 http://blog.csdn.net/byxdaz/archive/2010/04/11/5473557.aspx 当前各种主流数据库有很多,包括Oracle, MS SQL Server, Sybase, Informix, MySQL, DB2, Interbase / Firebird, PostgreSQL, SQLite, SAP/DB, TimesTen, MS ACCESS等等。数据库编程是对数据库的创建、读写等一列的操作。数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。数据库编程需要掌握一些访问数据库技术方法,还需要注意怎么设计高效的数据库、数据库管理与运行的优化、数据库语句的优化。 一、访问数据库技术方法 数据库编程分为数据库客户端编程与数据库服务器端编程。数据库客户端编程主要使用ODBC API、ADO、ADO.NET、OCI、OTL等方法;数据库服务端编程主要使用OLE DB等方法。 1、几种是数据库访问方法比较 ODBC API是一种适合数据库底层开发的编程方法,ODBC API 提供大量对数据源的操作,ODBC API能够灵活地操作游标,支持各种帮定选项,在所有ODBC相关编程中,API编程具有最高的执行速度。 DAO提供了很好的数据库编程的对象模型.但是,对数据库的所有调用以及输出的数据都必须通过Access/Jet 数据库引擎,这对于使用数据库应用程序,是严重的瓶颈。 OLE DB提供了COM接口,与传统的数据库接口相比,有更好的健壮性和灵活性,具有很强的错误处理能力,能够同非关系数据源进行通信。 ADO最主要的优点在于易于使用、速度快、内存支出少和磁盘遗迹小。 ADO.NET 是利用数据集的概念将数据库数据读入内存中,然后在内存中对数据进行操作,最后将数据集数据回写到源数据库中。 OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个C++编译中操控关系数据库的模板库, OTL中直接操作Oracle主要是通过Oracle提供的OCI接口进行,......

阅读全文(4698) | 评论:0

[转]VC++6.0 下搭建 wxWidgets 开发环境(2008-11-12 12:59:00)

摘要:和 GTK、QT、SWT、SWING 一样,wxWidgets 也是一种开源跨平台的 GUI 框架。因 wxWidgets 和 MFC 有些渊源,有些亲近,故要体验一番 wxWidgets。现在最新版是 2.8.7。wxWidgets 程序还可运行于 Windows CE、Palm OS。不但包括 GUI,还有 Media、Socket、ODBC 等库。 详情请见 wxWidgets 的官方网站是:http://www.wxwidgets.org 本篇介绍 VC++6.0 下如何搭建 wxWidgets 的开发环境,包括编译 wxWidgets 源码和配置 VC 环境。所用 wxWidgets 的版本是 2.8.7。 第一步:下载并安装 wxWidgets 在 http://www.wxwidgets.org/downloads/ 下载到 wxWidgets 源码。 你可以下载 Windows 安装版 http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.8.7-Setup.exe (11.9M) 或者是 Zip 压缩版 http://prdownloads.sourceforge.net/wxwindows/wxMSW-2.8.7.zip (15.9M) 假如我们下载的是 wxMSW-2.8.7-Setup.exe,就可运行它,过程中我们假定选择的安装目录是 d:\wxWidgets-2.8.7。 完成后,我们看到安装目录所在空间的大小是 127M。 注意要给 wxWidgets 有足够的剩余空间,单是编译一个版本的静态库就会增至300多M,如果还要编译动态库再选择上 DEBUG 或者 RELEASE、ASCII 或是 UNICODE 等,还要编译 sample 的话,最后空间能够暴到 2G。 第二步:编译 wxWidgets 编译方式有两种,一种是在 VC++ 中打开 wx.dsw 进行编译,另一种是用 nmake 在命令行下编译。 1) nmake 编译 运行 cmd.exe 来到命令行下,进入到目录 d:\wxWidgets-2.8.7,然后执行 D:\wxWidgets-2.8.7>nmake -f makefile.vc 默认是......

阅读全文(5141) | 评论:0

为你的MFC程序添加宏脚本语言(2008-04-11 20:34:00)

摘要:为你的MFC程序添加宏脚本语言


原著: Ernest Laurentin

翻译:haily
下载源代码


屏幕截图



简介
我总是对脚本控件(msscript.ocx)如何使用和当需要使用的时候,C++ 开发者该如何应对感到惊奇。可能扩展名(.ocx)使他们觉得,那是vb!在本文中,我将解决这些界限,给出 C++ 开发者使用它的新的理由。

问题描述
由于MS开发者的努力而创造的 Windows 脚本技术,使在VB和 C++ 应用中使用vbScript和Jscript变得相当简单的。开发者只需要知道如何使用Microsoft脚本控件和如何给一个脚本方法传值就可以了。由此,首先我想要提出的一个包容类是CScriptObject。这个包容类的使用是非常简单的,她提供了你将会在你应用程序中使用的大部分功能。它能提供从文件和资源中中载入脚本(文本数据),得到方法列表,选择脚本语言和执行函数和语句的功能。本类不依赖于MFC,能在控制台程序(console Application)中使用。
    对脚本调用首先最重要的是要了解VBScript和Jscript只能处理VARIANT类型的参数。这就是我建立CSafeArrayHelper类的原因了。CSafeArrayHelper包容类允许你建立你将要传给你的Script函数的的参数。 class CSafeArrayHelper { public: CSafeArrayHelper(); ~CSafeArrayHelper(); bool Create(VARTYPE vt, UINT cDims, UINT lBound, UINT cCount); bool Destroy(); UINT GetDimension(); bool Attach(LPSAFEARRAY psa); bool AttachFromVariant(VARIANT* pVariant); LPSAFEARRAY Detach(); LPSAFEARRAY Get......

阅读全文(3079) | 评论:0