当前位置:首页 > 服务端 > windows 内存泄露debug的相关函数

windows 内存泄露debug的相关函数

http://www-d0.fnal.gov/d0dist/dist/releases/development/l3xDAQSuper/src/debug_utils/Source/memory_leak_checker.cpp
//
// memory_leak_checker.cpp
//
// This guy's constructor will start leak checking and when
// its destructor is called it will print out error messages
// if there is any memory that has been allocated.
//
#include "memory_leak_checker.hpp"
#include <iostream>

#include <CRTDBG.H>
#include <windows.h>

//
// memory_leak_checker
//
// Cache our state
//
memory_leak_checker :: memory_leak_checker (void)
#ifdef _DEBUG
: _memory_state (new _CrtMemState), _filename_valid (false)
#else
: _memory_state (0)
#endif
{
#ifdef _DEBUG
//
// Turn on leek checking
//

_old_tracking_flags = _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG | _CRTDBG_LEAK_CHECK_DF);// Turn on leak-checking bit

//
// Remember what the memory stuff looks like
//

_report_mode_warn = _CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_FILE );
_report_mode_error = _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE );
_report_mode_assert = _CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_FILE );

_report_file_warn = _CrtSetReportFile( _CRT_WARN, _CRTDBG_FILE_STDOUT );
_report_file_error = _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDOUT );
_report_file_assert = _CrtSetReportFile( _CRT_ASSERT, _CRTDBG_FILE_STDOUT );

_CrtMemCheckpoint(_memory_state);

#endif
}

//
// set_file
//
// Set the output file
//
void memory_leak_checker::set_file (const char *filename, bool append)
{
unsigned int create_flags = CREATE_ALWAYS;
if (append) {
create_flags = OPEN_ALWAYS;
}

_filename_handle = ::CreateFile (filename, GENERIC_WRITE, 0, 0, create_flags, FILE_ATTRIBUTE_NORMAL, 0);
_filename_valid = _filename_handle != INVALID_HANDLE_VALUE;

if (_filename_valid) {

//
// Get to the end of the file
//

::SetFilePointer (_filename_handle, 0, 0, FILE_END);

//
// Set up the various report handles
//

_CrtSetReportFile ( _CRT_WARN, _filename_handle);
_CrtSetReportFile ( _CRT_ERROR, _filename_handle);
_CrtSetReportFile ( _CRT_ASSERT, _filename_handle);
}
}

//
// ~memory_leak_checker
//
// Restore everything and print out the current state of
// the memory heap.
//
memory_leak_checker :: ~memory_leak_checker (void)
{
#ifdef _DEBUG
//
// See if there is any difference between now and then.
//

_CrtMemState state_now;
_CrtMemCheckpoint(&state_now);

_CrtMemState the_difference;
if (_CrtMemDifference(&the_difference, _memory_state, &state_now)) {
std::cout << "***" << std::endl << "*** Memory Leak Seen!" << std::endl << "***" << std::endl;
_CrtMemDumpStatistics(&the_difference);
_CrtMemDumpAllObjectsSince(_memory_state);
}

delete _memory_state;
//
// Reset the memory tracking flags
//

_CrtSetDbgFlag (_old_tracking_flags);

//
// Reset the error reporting
//

_CrtSetReportMode( _CRT_WARN, _report_mode_warn);
_CrtSetReportMode( _CRT_ERROR, _report_mode_error);
_CrtSetReportMode( _CRT_ASSERT, _report_mode_assert);

_CrtSetReportFile( _CRT_WARN, _report_file_warn);
_CrtSetReportFile( _CRT_ERROR, _report_file_error);
_CrtSetReportFile( _CRT_ASSERT, _report_file_assert);

//
// CLose a file if we have it open
//

if (_filename_valid) {
::CloseHandle (_filename_handle);
}

#endif
}

//
// break_on_block
//
// Cause a debugger break point when a certian block is allocated.
//
void memory_leak_checker::break_on_block (long block_number)
{
#ifdef _DEBUG
_CrtSetBreakAlloc(block_number);
_crtBreakAlloc = block_number;

#endif
}

来源链接:https://www.cnblogs.com/cutepig/archive/2009/06/21/1507742.html

版权声明:
1、Java侠(https://www.javaxia.com)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。

2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaxia.com/server/125126.html

标签: out of memory
分享给朋友:

“windows 内存泄露debug的相关函数” 的相关文章

划分子网和构造超网的学习2022年05月17日 13:57:19
[C#]richtextbox实现行号2022年05月17日 20:27:54
[C#][控件]文本类控件2022年05月17日 20:45:24
配置 yum 源的两种方法2022年05月19日 19:54:29
Java日志框架那些事儿2022年05月19日 20:04:37
ubuntu 20.04修改数据源配置2022年05月20日 10:09:56
Hugo LoveIt主题配置与使用2022年05月23日 21:56:27
Tomcat服务器目录结构2022年05月28日 22:49:58