gpt4 book ai didi

c++ - 针对内存泄漏调试 Win32 API 应用程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:37 27 4
gpt4 key购买 nike

我正在阅读如何在 Win32 应用程序上使用 C++ new 运算符和标准 CRT malloc 函数查找内存泄漏。

我添加了一些用于使用 Windows 套接字的东西,我想仅在 Debug模式下运行时包含 crtdbg.h,以及一些其他定义。所以我最终将它拼凑到我的 stdafx.cpp 中作为我的标准预编译头文件:

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include "targetver.h"

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>

// Windows Sockets
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")


// If running in debug mode we need to use this library to check for memory leaks, output will be in DEBGUG -> WINDOWS -> OUTPUT
// http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
#ifdef _DEBUG
//http://stackoverflow.com/questions/8718758/using-crtdumpmemoryleaks-to-display-data-to-console
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#endif // _DEBUG

我还打算将这些行放在程序的退出点之前:

#ifdef _DEBUG  
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_DEBUG );
_CrtDumpMemoryLeaks();
#endif

无论如何,它似乎可以编译,但我收到一些奇怪的警告:

warning C4005: '_malloca': macro redefinition

来自 crtdbg.h。这是由于 stdafx.h 中 header 的顺序错误造成的,还是这是正常现象?此外,我是否在正确的轨道上检测 Win32 应用程序中的内存泄漏,或者我应该在 Visual Studio 中使用其他东西吗?

最佳答案

From the crtdbg.h. Is this due to the wrong ordering of the headers in the stdafx.h, or is this normal?

也许 this article可以帮你。注意这部分:

要使 CRT 功能正常工作,#include 语句必须遵循此处显示的顺序。


你可以使用 Visual Leak Detector用于查找与其他人提到的 new 运算符缺少 delete 相关的泄漏。我对此有很好的经验,但我通常倾向于三重检查我的代码中是否每个 new 都有相应的 delete 调用。


Also, am I on the right track for detecting memory leaks in Win32 apps or is there something else I should be using in Visual Studio?

另一种类型的内存泄漏是 GDI 泄漏。当您不恢复 device context 时通常会发生这些情况到原始状态,或者您忘记删除 GDI 对象

对于那些泄漏,我使用 GDIView .它的用法有很好的描述,但如果您有任何问题,请发表评论。

您可能会找到 this article有用。

当然,有很多好的工具,这只是我的建议。

希望这对您有所帮助。

最好的问候。

关于c++ - 针对内存泄漏调试 Win32 API 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22229518/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com