我目前正在开发自己的内存泄漏跟踪系统。
我正在使用Microsoft Visual C ++ 2008,我知道它们内置了一个,但我一直为自己制作一个,只是为了它的乐趣。
但是,当我覆盖new和new []命令时,无论我做什么,都会出现函数重定义错误。
我对Microsoft Visual C ++对内容的内部绑定了解不多,但我听说CRT已经定义了与我完全相同的宏。
我在这里和其他地方看到的文章针对同样的问题,但是 人们似乎永远无法解决问题或从未对他们如何做出明确的答案 解决了它。
这是我到目前为止所有的代码:
MLD.h:http://pastebin.com/SfHzNaeN MLD.cpp:http://pastebin.com/aRhsTZpv
所有代码都基于旧的flipcode文章(如何检测内存泄漏)。 对不起,我不能给你一个直接链接,因为我没有10个代表发布超过2个超链接。
感谢您的时间。
答案 0 :(得分:2)
“函数重定义错误”可能是因为您正在使用MFC。
运行时库不应该用于定义这样的分配和释放函数。
当前代码的
struct MemLeakInfo
{
unsigned int addr;
unsigned int line;
unsigned int size;
unsigned char file;
};
是不好的。即使它位于32位Windows中,也不能保证unsigned int
足够大以容纳地址。相反,请使用intptr_t
。
此外,当前代码的
void* operator new(unsigned int Size, int Line, const char* File);
是不好的。那应该是......
void* operator new( size_t Size, int Line, const char* File );
你需要一个相应的operator delete
,比如......
void* operator delete( void* p, int Line, const char* File );
为了从失败的构造函数调用中释放内存。它仅在非常特殊的情况下被调用。但是如果你没有它,那么你就会有漏洞,因为MFC曾经用于调试构建。
<小时/> 编辑:您现在提供的代码的修复版本:
file [minimal.h]:
_MINIMAL_H
无效,因为它以下划线后跟大写字母开头,后者是保留的。已更改为MINIMAL_H
。size_t
,您需要加入<stddef.h>
。_DEBUG
不是标准宏。这是一种微观主义。为此目的,标准宏(查找assert
的文档)是NDEBUG
。
#ifndef MINIMAL_H
#define MINIMAL_H
#include <stddef.h> // std::size_t
#ifndef NDEBUG
void* operator new( size_t Size, int Line, const char* File );
void* operator new[]( size_t Size, int Line, const char* File );
void operator delete( void* ptr, int Line, const char* File );
void operator delete[]( void* ptr, int Line, const char* File );
#endif
#ifndef NDEBUG
#define DEBUG_NEW new( __LINE__, __FILE__ )
#else
#define DEBUG_NEW new
#endif
#endif //MINIMAL_H
file [minimal.cpp]:
malloc
,您需要加入stdlib.h
。#define new
时,您会对以下代码中的new
个关键字造成严重破坏。malloc
的结果,而在C ++中你应该只在有需要的时候施放东西。这里没有这样的需要。只投了面具虫,这不是个好主意。throw std::bad_alloc
。这是由神圣标准对这些功能的说明。
#include "Minimal.h"
//#define new DEBUG_NEW
#ifndef NDEBUG
#include <stdlib.h> // malloc
#include <exception> // std::bad_alloc
void* operator new( size_t const size, int, const char*)
{
void* const ptr = malloc( size );
if( !ptr ) { throw std::bad_alloc(); }
return ptr;
};
void* operator new[]( size_t const size, int, const char*)
{
void* const ptr = malloc( size );
if( !ptr ) { throw std::bad_alloc(); }
return ptr;
}
void operator delete(void* const ptr, int, const char*)
{
free( ptr );
};
void operator delete[]( void* const ptr, int, const char* )
{
free( ptr );
};
#endif