C++内存泄露(Memory Leak Faults)之高级篇

C++内存泄露(Memory Leak Faults)之高级篇

       如果在构造函数中有申请内存的操作,且在其他程序中有两个对象直接或间接的赋值操作,如果没有对“=”运算符进行重载定义,则会产生两次释放同一次内存操作的错误。该错误为第7类的内存错误。

Demo代码如下:

/* FileName: MemoryLeakFault2.cpp Author: ACb0y Create Time: 2011年2月27日14:22:11 Last modify Time: 2011年2月27日15:05:39 */ #include <iostream> using namespace std; #define TEST /* 测试基类 */ class base { public: char * strName; base(char *); base(const base &); ~base(); #ifdef TEST base & operator = (const base &); #endif }; /* 构造函数,在构造函数里有动态申请空年。 */ base::base(char * str) { strName = new char[strlen(str) + 1]; strcpy(strName, str); } //拷贝构造函数 base::base(const base & r) { strName = new char[strlen(r.strName) + 1]; strcpy(strName, r.strName); } /* 析构函数,释放空间 */ base::~base() { if (NULL == strName) { return ; } else { cout << "释放的空间地址为:" << (int)strName << endl; delete [] strName; } } #ifdef TEST /* 赋值运算符。 */ base & base::operator = (base const & r) { if (this == &r) { cout << "the same object" << endl; } else { if (NULL != this->strName) { delete [] this->strName; } this->strName = new char[strlen(r.strName) + 1]; strcpy(this->strName, r.strName); } return *this; } #endif int main() { base a("base_a"); base b("base_b"); a = b; return 0; }

运行结果如下:

C++内存泄露(Memory Leak Faults)之高级篇_第1张图片

      但把,程序开头部分的#define TEST你运行结果会发现,统一地址的空间被释放了两次。从而发生内存泄露。

 

你可能感兴趣的:(C++,object,测试,null,delete,leak)