Joh*_*ohn 16 c++ memory-leaks crt visual-studio
我正在使用Visual Studio 2010中的SDL进行游戏.我遇到了_CrtDumpMemoryLeaks()宏,并认为我会试一试.调用_CrtDumpMemoryLeaks()会将内存泄漏打印到输出窗口,但它不会显示它发生的位置.
我已经阅读了内存泄漏检测启用的MSDN文章,它解释了如果我定义_CRTDBG_MAP_ALLOC它应该输出有问题的语句的行号.在我的情况下,这不会发生.(但是,如果我直接使用malloc(),而不是使用'new',我能够让它工作.
代码:
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int *var = new int(5);
_CrtDumpMemoryLeaks();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
Run Code Online (Sandbox Code Playgroud)
Detected memory leaks!
Dumping objects ->
{58} normal block at 0x007D1510, 4 bytes long.
Data: < > 05 00 00 00
Object dump complete.
If _CrtDumpMemoryLeaks()在使用"new"分配时无法输出行号,然后建议其他方法来实现类似的行为.
当您定义_DEBUG并包含时,<crtdbg.h>您将获得一个重载operator new,它会使用其他参数来指定放置new表达式中的文件和行号.
例如
int* p = new (_NORMAL_BLOCK, __FILE__, __LINE__) int(5);
Run Code Online (Sandbox Code Playgroud)
您可以将其包装在有条件定义的宏中,例如
#ifdef _DEBUG
#define DEBUG_NEW_PLACEMENT (_NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NEW_PLACEMENT
#endif
int* p = new DEBUG_NEW_PLACEMENT int(5);
Run Code Online (Sandbox Code Playgroud)
虽然你确实看到人们定义一个宏new来完全隐藏这个表单客户端代码,但我个人并不推荐它,因为它打破了任何已故意使用placement new的内容,你必须确保任何使用placement new的头文件(例如许多标准头文件)包含在任何标题重新定义之前new.这样可以很容易地让new头文件中的某些内联使用无需"调整".
| 归档时间: |
|
| 查看次数: |
21302 次 |
| 最近记录: |