2

我目前正在开发自己的内存泄漏跟踪系统。

我正在使用 Microsoft Visual C++ 2008,我知道他们有一个内置的,但我一直在为自己制作一个,只是为了好玩。

但是,当我覆盖 new 和 new[] 命令时,无论我做什么,都会出现函数重新定义错误。

我对 Microsoft Visual C++ 的内部绑定了解不多,但我听说 CRT 已经定义了与我完全相同的宏。

我在这里和其他地方看到过针对这个相同问题的文章,但是人们似乎永远无法解决问题,或者永远不会就他们如何解决问题给出明确的答案。

这是我到目前为止的所有代码:

MLD.h:http ://pastebin.com/SfHzNaeN MLD.cpp: http : //pastebin.com/aRhsTZpv

所有代码都大致基于旧的翻转代码文章(如何检测内存泄漏)。抱歉,我不能给你一个直接链接,因为我没有 10 个代表来发布超过 2 个超链接。

谢谢你的时间。

4

1 回答 1

2

“函数重新定义错误”可能是因为您使用的是 MFC。

运行时库不应负责定义此类分配和解除分配功能。

当前代码的

struct MemLeakInfo
{
        unsigned int addr;
        unsigned int line;
        unsigned int size;
        unsigned char file;
};

不好。unsigned int即使在 32 位 Windows 中,也不能保证An足够大以容纳地址。相反,使用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 曾经用于调试构建一样。


编辑:您现在提供的代码的固定版本:

文件 [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

文件 [minimal.cpp]:

  • 要使用malloc,您需要包含stdlib.h.
  • 当您对以下代码中#define new的关键字造成严重破坏时。new
  • 在 C 中,您永远不应该转换 的结果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
于 2012-05-20T15:22:01.530 回答