C ++ new,delete,new []和delete []

时间:2012-05-20 14:57:01

标签: c++ visual-c++

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

我正在使用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个超链接。

感谢您的时间。

1 个答案:

答案 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个关键字造成严重破坏。
  • 在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