怎样重载一个new和delete函数,使得在new和delete的时候,可以先输出本次new和delete的内存的大小?解决思路

怎样重载一个new和delete函数,使得在new和delete的时候,可以先输出本次new和delete的内存的大小?
我这样子重载了一个new函数,怎么不进去我这个重载函数?


void *operator new(size_t cb){
OutputDebugString("I have a my NEW");
return ::operator new(cb);
}; 


void CMyTestDlg::OnBnClickedButtonTestnew()
{
CAboutDlg *pDlg = new CAboutDlg;
pDlg -> DoModal();
}

为何不执行我上面的那个重载函数,并打印相关的信息?

------解决方案--------------------
VC debug版本么?
你需要将每个文件头的
#define new DEBUG_NEW 这行去掉

------解决方案--------------------
在debug的时候没有new所以自然无法重载你的new delete了

------解决方案--------------------
C/C++ code

看一下cpp里面是否有:
#ifdef _DEBUG
#define new DEBUG_NEW    //...注释掉
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

------解决方案--------------------
探讨
C/C++ code
看一下cpp里面是否有:
#ifdef _DEBUG
#define new DEBUG_NEW //...注释掉
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

------解决方案--------------------
探讨
我把它注释掉了,或者在Release版下面编译,会出如下问题:e:\资料\mytest\mytestdlg.cpp(153) : warning C4717: “operator new” : 如递归所有控件路径,函数将导致运行时堆栈溢出

程序运行的时候,就一直会这样子new下去,直到内存溢出为止。

------解决方案--------------------
http://www.hackhome.com/InfoView/Article_97322.html
版权申明 
本文可以被*转载,但是必须遵循如下版权约定: 
1、保留本约定,并保留在文章的开头部分。 
2、不能任意修改文章内容,或者删节,增加。如果认为本文内容有不当之处需要修改,请 
与作者联系。 
3、不能摘抄本文的内容,必须全文发表或者引用。 
4、必须保留作者署名、注明文章出处。(本文授权给www.Linuxaid.com.cn) 
5、如不遵守本规定,则无权转载本文。
作者 
ariesram 
电子邮件地址 
ariesram@linuxaid.com.cn, 或 ariesram@may10.ca 
本文及本人所有文章均收集在bambi.may10.ca/~ariesram/articles/中。 
本文授权给www.linuxaid.com.cn。 

正文: 
我曾经参与过一个比较大的项目,在这个项目里面,我们没有一个完全确定的设计文档,所以程序的实现常常变动。虽然我们有一个比较灵活的框架,但是从程序的角度来讲,它使我们的程序非常的混乱。直到发布的日期临近,我们还没有一个稳定的可以用来做alpha测试的版本。所以我们必须尽快的删除掉无用的代码,让这个版本足够的稳定。但是,在这个没有足够规范的软件公司,我们没有时间也没有足够的精力来做边界测试之类的工作。所以我们只能采用变通的办法。在软件中最大的问题就是内存泄漏。因为往往出现这样的情况,我们在一段代码中分配了内存,但是却没有释放它。这造成了很大的问题。我们需要一个简单的解决方案,能够简单的编译进这个项目,在运行的时候,它能够产生一个没有被释放的内存的列表,用这个列表,我们能够改正程序的错误。这就是我们称之为内存跟踪的方法。首先,我们需要一种代码,能够被加入到源代码中去,而且这种代码能够被重用。代码重用是一种很重要的特性,能够节省大量的时间和金钱以及程序员的劳动。另外,我们的这种代码必须简单,因为我们当时已经没有那么多的时间和精力去完全重看一遍所有的代码来重新编写以及改正错误从而使内存跟踪能够起作用。 

好在,我们总能够找到解决的办法。首先,我们检查了代码,发现所有的代码都是用new来分配内存,用delete来释放内存。那么,我们能够用一个全程替换,来替换掉所有的new和delete操作符吗?不能。因为代码的规模太大了,那样做除了浪费时间没有别的任何好处。好在我们的源代码是用C++来写成的,所以,这意味着没有必要替换掉所有的new和delete,而只用重载这两个操作符。对了,值用重载这两个操作符,我们就能在分配和释放内存之前做点什么。这是一个绝对的好消息。我们也知道该如何去做。因为,MFC也是这么做的。我们需要做的是:跟踪所有的内存分配和交互引用以及内存释放。我们的源代码使用Visual C++写成,当然这种解决方法也可以很轻松的使用在别的C++代码里面。要做的第一件事情是重载new和delete操作符,它们将会在所有的代码中被使用到。我们在stdafx.h中,加入: 
#ifdef _DEBUG 
inline void * __cdecl operator new(unsigned int size,
const char *file, int line) 

}; 
#ifdef _DEBUG 
#define DEBUG_NEW new(__FILE__, __LINE__) 
#else 
#define DEBUG_NEW new 
#endif 
#define new DEBUG_NEW 
现在我们所有的接受一个参数的new操作符都成为了接受三个参数的new操作符号,__FILE__和__LINE__被预编译器自动的插入到其中了。然后,就是作实际的跟踪了。我们需要加入一些例程到我们的重载的函数中去,让它们能够完成分配内存和释放内存的工作。这样来做, #ifdef _DEBUG 
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);