c++内存泄露检测,长文慎入! (三)

2014-11-24 02:32:56 · 作者: · 浏览: 7
nptrs].line = line;
++nptrs;
}
if (traceFlag)
{
printf("Allocated %u bytes at address %p ", siz, p);
printf("(file: %s, line: %ld)\n", file, line);
}
return p;
}

// Overload array new
void* operator new[](size_t siz, const char* file,
long line)
{
return operator new(siz, file, line);
}

// Override scalar delete
void operator delete(void* p)
{
if (findPtr(p) >= 0)
{
free(p);
assert(nptrs > 0);
delPtr(p);
if (traceFlag)
{
printf("Deleted memory at address %p\n", p);
}
}
else if (!p && activeFlag)
{
printf("Attempt to delete unknown pointer: %p\n", p);
}
}

// Override array delete
void operator delete[](void* p)
{
operator delete(p);
}

那哥们的测试工程,挺不错的,有3种情况:

[cpp]
#include "stdafx.h"
#include
#include
#include

#include "MemCheck.h" // Must appear last!
using namespace std;

void Test()
{
int *i = new int(0);
}

class MyClass
{
private:
int *p;
public:
MyClass()
{
if(p != NULL)
{
p = new int(0);
}
}
~MyClass()
{
if(p != NULL)
{
delete p;
p = NULL;
}
}
};

void Test2()
{
int *i = NULL; // better for read
i = new int(0);
int *&y = i; // pointer's reference
delete i;

MyClass *pMyClass = new MyClass();

std::vector myClasses;
myClasses.push_back(new MyClass());
myClasses.push_back(new MyClass());

std::vector myVector;
myVector.push_back(new MyClass());
myVector.push_back(new MyClass());
delete (MyClass *)(myVector.at(0));
delete myVector.at(1); // memory leak
}

class Foo
{
char* s;
public:
Foo(const char*s )
{
this->s = new char[strlen(s) + 1];
strcpy(this->s, s);
}
~Foo()
{
delete [] s;
}
};

void Test3()
{
cout << "hello\n";
int* p = new int;
delete p;
int* q = new int[3];
delete [] q;
/**//*delete r;*/
vector v;
v.push_back(1);
Foo s("goodbye");
}

int main()
{
TRACE_OFF();
MEM_ON();
Test();
Test2();
Test3();
MEM_OFF();
}