网管联盟 | 网管论坛 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 俱乐部 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 网络攻防 > 安全文摘 > 编程技术 > VC++6.0中内存泄漏检测  

VC++6.0中内存泄漏检测 评论 论坛

2007-05-19   作者:bitsCN整理   来源:中国网管联盟   PV:

关键词:


对C++代码而言,内存泄漏问题虽然有诸多方法避免,但实际代码编写的时候,或出于自信或出于复杂性的考虑,常常还会用到原始的operator new,这不可避免的会带来内存泄漏的可能,不久前本人因为违反了"可用于被多态继承的基类其析构函数应当有virtual修饰"的法则( 一不小心就忘了写virtual ^_^ ),导致了内存泄漏,因此我觉得出于安全考虑,在代码中加入内存泄漏检查机制还是很必要的,也因为这次的内存泄漏事件促使我写出这一篇文章.
VC++中本身就有内存泄漏检查的机制,你可以在向导生成的支持MFC的工程中看到如下代码:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
通过它们,你能非常容易的发现代码中的内存泄漏,但是如果手工将这个功能移植到非MFC工程中去是很繁琐的一件事,另外它还有一个bug,在多线程并发调用这个DEBUG_NEW时会导致系统级错误,因此本人在此重写了这个功能,将以下的debug_new.h和debug_new.cpp添加到工程中,并在需要检测的cpp中#include "debug_new.h"和main中一开始处加入REG_DEBUG_NEW宏即可.
1. debug_new.h 源代码
/************************************************************************/ bitsCN.Com
/* comment: 此文件与debug_new.cpp配合使用,用于在调试期发现内存泄漏 */
/* 仅在VC++编译器中适用(包括Intel C++,因为它使用了相同的库) */
/* 作者: 周星星 http://blog.vckbase.com/bruceteen/ */
/* 版权申明: 无,可任意 使用,修改 和 发布 */
/************************************************************************/
/* sample
#include
#include "debug_new.h" // +
using namespace std;
int main( void )
{
REG_DEBUG_NEW; // +
char* p = new char[2];
cout
d:\test.cpp(10) : {45} normal block at 0x003410C8, 2 bytes long.
Data:  CD CD
Object dump complete.
如果不出现如上提示请Rebuild All一次.
*/
#ifndef _DEBUG_NEW_H_
#define _DEBUG_NEW_H_
#ifdef _DEBUG
#undef new
extern void _RegDebugNew( void );
extern void* __cdecl operator new( size_t, const char*, int );
extern void __cdecl operator delete( void*, const char*, int);
#define new new(__FILE__, __LINE__) bitsCN_com
#define REG_DEBUG_NEW _RegDebugNew();
#else
#define REG_DEBUG_NEW
#endif // _DEBUG
#endif // _DEBUG_NEW_H_

bitsCN_com

2. debug_new.cpp 源代码
/************************************************************************/
/* comment: 此文件与debug_new.h配合使用,用于在调试期发现内存泄漏 */
/* 仅在VC++编译器中适用(包括Intel C++,因为它使用了相同的库) */
/* 作者: 周星星 http://blog.vckbase.com/bruceteen/ */
/* 版权申明: 无,可任意 使用,修改 和 发布 */
/************************************************************************/
//#include "debug_new.h"
#ifdef _DEBUG
#include
#include
class _CriSec
{
CRITICAL_SECTION criSection;
public:
_CriSec() { InitializeCriticalSection( &criSection ); }
~_CriSec() { deleteCriticalSection( &criSection ); }
void Enter() { EnterCriticalSection( &criSection ); }
void Leave() { LeaveCriticalSection( &criSection ); }
} _cs;
void _RegDebugNew( void )
{
_CrtSetDbgFlag( _CRTDBG_REPORT_FLAG | _CRTDBG_LEAK_CHECK_DF );

www_bitscn_com


}
void* __cdecl operator new( size_t nSize, const char* lpszFileName, int nLine )
{
// comment 1: MFC中提供的debug new虽然加了锁,但我在实际测试的时候发现多线程并发
// 调用的时候还是抛出了系统错误,所以我在这里加了一个线程互斥量.
// comment 2: debug new和debug delete之间需不需要互斥我并不知道,保险起见,我同样
// 加了线程互斥量.
// comment 3: 按照C++标准规定,在operator new失败后应当调用set_new_handler设置的
// 函数,但是MSDN中却说"头文件new中的set_new_handler是stub的,而应该使
// 用头文件new.h中的_set_new_handler",这简直是滑天下之大稽.
// 以下是VC++6.0中的set_new_handler定义:
// new_handler __cdecl set_new_handler( new_handler new_p )
// {
// assert( new_p == 0 ); // cannot use stub to register a new handler
// _set_new_handler( 0 );
// return 0;
// }
// 所以我也无计可施,只能舍弃set_new_handler的作用.
_cs.Enter();
void* p = _malloc_dbg( nSize, _NORMAL_BLOCK, lpszFileName, nLine ); bitsCN_com
_cs.Leave();
return p;
}
void __cdecl operator delete( void* p, const char* /*lpszFileName*/, int /*nLine*/ )
{
_cs.Enter();
_free_dbg( p, _CLIENT_BLOCK );
_cs.Leave();
}
#endif
3. 事例代码
#include
#include "debug_new.h"
using namespace std;
int main( void )
{
REG_DEBUG_NEW;
char* p = new char[2];
p[0] = 'A';
p[1] = 'B';
cout
d:\test.cpp(10) : {45} normal block at 0x003410C8, 2 bytes long.
Data:  41 42
Object dump complete.
bitscn.com



收藏本文】 【推荐好友】 【欢迎投稿】 【打印本文
上一篇:如何用Shell病毒技术感染Linux脚本程序   下一篇:我一哥们的超变态生活
 相关文章:
·如何用Shell病毒技术感染Linux脚本程序 ·挂马代码大全
·两个批量挂马脚本 ·指定权限运行程序(Delphi编程)
·一个比较好的弹窗代码 破SP2 24小时弹一次 ·C语言编的unix病毒
VC++6.0中内存泄漏检测 评论:
    评论加载中…
  
  责任编辑:网盟  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
 
本类热门排行:
1.看黑客怎么编写强力蓝屏炸弹
2.无dll无进程木马源代码
3.一个写硬盘的VBS脚本程序
4.挂马代码大全
5.海阳顶端网ASP木马@2005α版全部源代码
6.ARP欺骗技术
7.C语言编的unix病毒
8.Belceb病毒编写教程---Win32篇
9.Billy Belceb病毒编写教程---Win32篇1
10.一个简单的文件型病毒程序
最新推荐文章:
1.网站防止注入入侵的一些有效代码和方法
2.推荐:教你如何编译Exploits
3.引黑客入瓮-给Linux系统蒙上Windows面纱
4.黑客技巧之防止外部数据提交的脚本
5.QQ尾巴病毒的Visual C++实现探讨
6.PHP的安全配置(二)
7.PHP的安全配置(一)
8.黑客字典II 算法分析
9.黑客如何用VB制作远程控制软件
10.解密 HtmlShip 加密的 html 文件
本类最新文章:
1.网站防止注入入侵的一些有效代码和方法
2.如何编写通用的ASP防SQL注入攻击程序
3.一个Web网页下蠕虫的简单实现
4.推荐:教你如何编译Exploits
5.计算是否处在同一子网下的php脚本
6.PHP初学者的烦脑?
7.PHP安全编程加密功能
8.radmin端口密码读取工具-RadminReader Fo
9.asp,PHP与.net伪造HTTP-REFERER方法及防
10.VB 从零开始编外挂(十二)
网管论坛交流:
·网吧常用工具
·IBM X455服务器+windows2003+sql群集 图
·做一個優雅的女人
·【网络警4.33 0523 版本 xxcn发布2008用
·最不应该对父母说的十句话!
·arp欺骗病毒排查实例
·(免疫补丁下载)最新IGM、机器狗 病毒穿透
·批处理调用讯闪模块更新QQ阿拉发贴优化修
·从WORD和EXCEL插入及提取FLASH
·竹韵洗心