重载新的和删除

时间:2009-12-06 13:33:55

标签: c++ overloading new-operator

我尝试按照这篇文章: http://flipcode.com/archives/How_To_Find_Memory_Leaks.shtml

重载我的new和delete函数以跟踪内存泄漏。

但是 - 如果我尝试编译,我会得到一个

C2365:“operator new”:重新定义;以前的定义是“功能”

在xdebug文件中

xdebug包含在xlocale中 - 但是,我无法找到我的项目包含xlocale的位置

我在项目中使用MFC进行多线程处理。

有人可以告诉我如何让内存泄漏跟踪工作吗?

//编辑: 所以这是我的findMemoryLeak.h,它包含在stdafx.h的末尾

#ifndef _FINDMEMORYLEAK_H
#define _FINDMEMORYLEAK_H

#include <list>
using namespace std;

#ifdef _DEBUG

typedef struct {
    DWORD   address;
    DWORD   size;
    char    file[64];
    DWORD   line;
} ALLOC_INFO;

typedef list<ALLOC_INFO*> AllocList;

AllocList *allocList;

void AddTrack(DWORD addr,  DWORD asize,  const char *fname, DWORD lnum)
{
    ALLOC_INFO *info;

    if(!allocList) {
        allocList = new(AllocList);
    }

    info = new(ALLOC_INFO);
    info->address = addr;
    strncpy(info->file, fname, 63);
    info->line = lnum;
    info->size = asize;
    allocList->insert(allocList->begin(), info);
};

void RemoveTrack(DWORD addr)
{
    AllocList::iterator i;

    if(!allocList)
        return;
    for(i = allocList->begin(); i != allocList->end(); i++)
    {
        if((*i)->address == addr)
        {
            allocList->remove((*i));
            break;
        }
    }
};


void DumpUnfreed()
{
    AllocList::iterator i;
    DWORD totalSize = 0;
    char buf[1024];

    if(!allocList)
        return;

    for(i = allocList->begin(); i != allocList->end(); i++) {
        sprintf(buf, "%-50s:\t\tLINE %d,\t\tADDRESS %d\t%d unfreed\n",
            (*i)->file, (*i)->line, (*i)->address, (*i)->size);
        OutputDebugString(buf);
        totalSize += (*i)->size;
    }
    sprintf(buf, "-----------------------------------------------------------\n");
    OutputDebugString(buf);
    sprintf(buf, "Total Unfreed: %d bytes\n", totalSize);
    OutputDebugString(buf);
};


inline void * __cdecl operator new(unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    AddTrack((DWORD)ptr, size, file, line);
    return(ptr);
};

inline void __cdecl operator delete(void *p)
{
    RemoveTrack((DWORD)p);
    free(p);
};

inline void * __cdecl operator new[](unsigned int size, const char *file, int line)
{
    void *ptr = (void *)malloc(size);
    AddTrack((DWORD)ptr, size, file, line);
    return(ptr);
};

inline void __cdecl operator delete[](void *p)
{
    RemoveTrack((DWORD)p);
    free(p);
};
#endif

//make the normal new function call the new function with three parameters
#ifdef _DEBUG
#define DEBUG_NEW new(__FILE__, __LINE__)
#else
#define DEBUG_NEW new
#endif
#define new DEBUG_NEW


#endif

当我在stdafx.h的末尾包含它时,我得到成千上万的compilererrors,其中大部分都在xdebug或xlocale中,第一个是

C2365:“operator new”:重新定义;以前的定义是“功能”

在xdebug第32行

5 个答案:

答案 0 :(得分:2)

我刚才解决了这个问题。

发生的事情是new这个词在你达到重载时是一个宏(被授予,它没有解决我们的链接问题)但是尝试添加:

#undef new

在文件中的最后一个include指令之后但在第一个new重载之前。

修改

这是因为在您在某些CPP文件中包含内存泄漏检测代码之前包含了stdafx.h(或其他包含定义DEBUG_NEW的文件)(您应该能够找出编译器错误中的哪一个) 。因此new被定义为一个宏,它会导致编译器在定义处进行barf。

答案 1 :(得分:1)

找到包含xlocale的位置。只需将xlocale的名称更改为其他名称即可。 尝试编译,你会看到它失败的地方

答案 2 :(得分:0)

在Visual Studio中,程序的调试版本已经使用“调试堆”,因此您不需要自己的检测。

使用平台的调试功能,您可以在程序结束时调用_CrtDumpMemoryLeaks,而不会实际上重载所有内容。

答案 3 :(得分:0)

您正在定义Microsoft为自己的调试定义的相同重载,并运行到他们的调试中。我建议为操作员添加一个额外的虚拟参数。

我还建议在将它放在那里之前在stdafx.h中调试 not

答案 4 :(得分:-2)

尝试使用std lib以这种方式调试并不会真正解决问题。它不会捕获所有(或任何)内存分配。这只是不使用std lib,stl或boost的百万理由之一。