Is there a way to write a memory leak detector supporting new(nothrow)?

L

Lighter

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.
 
A

Alan Johnson

Lighter said:
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.

Overloading new and delete to detect memory leaks is a brittle solution.
Using macros to redefine a keyword is more brittle. At that point you
are relying on clients to correctly use one thing (your redefined new)
to detect incorrectly using another thing (ironically, the same thing
you are relying on them to use correctly).

A better solution is to use some memory debugger like Valgrind or
Purify. There is a list of memory debuggers on wikipedia:
http://en.wikipedia.org/wiki/Memory_debugger
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,731
Latest member
MarcyGipso

Latest Threads

Top