Re: Is there a way to write a memory leak detector supporting new(nothrow)?
On 17 Aug 2006 21:58:07 -0700, "Lighter" <cqulyx@gmail.com> wrote:
Is there a way to write a memory leak detector supporting new(nothrow)?
For example,
#include <My_Debug_New.h>
using namespace std;
int main()
{
int* p1 = new int;
int* p2 = new(nothrow) int; // note this!!!
}
Ideally, after running it in debug mode, owing to p1 and p2 are not
deleted, the output window of the IDE should report memory leaks with
source file names and actual line numbers.
Provided that the whole program doesn't use new(nothrow), I can
implement a memory leak detector as follows:
#if _DEBUG
void* operator new(size_t size, char* srcFileName, int nLineNum);
void* operator delete(void* p);
// ......
#define new new(__FILE__, __LINE__)
#endif
However, by using macro, new and new(nothrow) cannot be simultaneouly
supported. My question is: How to implement this feature that can
simultaneously support? Is this feasible?
Thanks in advance for any help.
Redefining keywords is evil (not to mention illegal) and should be avoided.
You're basically reinventing what the MFC ClassWizard inserts at the top of
every source file (and what I always delete):
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
Like MFC, you'll interfere not only with new(nothrow), but also all other
forms of placement new, not to mention class-specific operators new. This
is just not an effective approach. Besides interfering with these things,
it only addresses new used within scope of the macro. Tools such as Purify
implement a much more comprehensive and unintrusive approach by
instrumenting the code after it's been compiled. That's a hard thing to do,
and it's worth paying for. There are some free leak finders you should
check out, including the one by Jochen Kalmbach:
http://www.codeproject.com/tools/leakfinder.asp
Finally, you could adopt practices that all but eliminate leaks, such as
using smart pointers instead of plain pointers and classes such as
std::vector when you need a dynamic array.
--
Doug Harrison
Visual C++ MVP