http://blog.csdn.net/acb0y/article/details/6211335
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;
- }
运行结果如下:
但把,程序开头部分的#define TEST你运行结果会发现,统一地址的空间被释放了两次。从而发生内存泄露。