Re: Is there a way to write a memory leak detector supporting new(nothrow)?
Lighter 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
I can think of one way to record both new and new(std::nothrow)
allocations - although the solution is somewhat more elaborate. The
idea is to declare a "NewRecorder" class and then insert NewRecorder
temporaries into the source code every time new is called.
The first step in this approach would be to define the NewRecorder
class. NewRecorder's constructor is expected to be initialized with the
file name and line number in which the call to new appears in the
source file. The memory allocation itself would be recorded in
NewRecorder's operator<< method, at which point the source file, line
number and pointer value of the allocation have been collected. (In
example below, NewRecorder just sends that information to std::cout):
struct NewRecorder
{
NewRecorder(const char *file, int lineNo)
: mFile(file), mLineNo(lineNo)
{
}
template <class T>
T * operator<<(T* t) const
{
// send to std::cout as a demonstration
std::cout << mFile << ":" << mLineNo
<< " " << t << "\n";
// Record mFile, mLineNo and t here:
// ...
}
private:
const char *mFile;
const int mLineNo;
};
Next define new as a macro like this:
#define new NewRecorder(__FILE__,__LINE__) << new
Now lines of code that call new - such as the following
int* p1 = new int;
int* p2 = new(std::nothrow) int; // note this!!!
are transformed into:
int* p1 = NewRecorder("test.cc", 74) << new int;
int* p2 = NewRecorder("test.cc", 75) << new(std::nothrow) int;
after preprocessing. Thereby the source file, line number and pointer
value of both new and new(std::nothrow) calls can be recorded.
Greg
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]