C++内存泄露的实例源码

C++内存泄露的实例源码。

一、如下代码存在内存泄露
#include
using namespace std;
class A
{
public:
   A(char *cstr);
   A(const A &ca);
   A();
   ~A();
   operator=(const A &ca);
private:
   char *str;
};                        
A::A(char *cstr)            
{
   str = new char[20];
   strcpy(str, cstr);
}
A::A(const A &ca)           
{
   str = new char[20];
   strcpy(str, ca.str);
}
A::operator=(const A &ca)   
{
   str = new char[20];      
   strcpy(str, ca.str);
}
A::A() : str(new char[20])
{
   strcpy(str, “Welcome!”);
}
A::~A()
{
   delete[] str;
   str = NULL;
}
int main(void)
{
   A a(“Hello world!”);
   A b(a);
   A c;
   c = b;
   return 0;
}
二、内存泄露的原因
原因在于
A::operator=(const A &ca)   
{
   str = new char[20];      
   strcpy(str, ca.str);
}
由于构造函数中已经为str申请了内存,此时为str再次重新申请内存,则原来申请的内存无法收回了。
三、如何针对性地修改
(1) 方法一:
A::operator=(const A &ca)   
{
   delete[] str;
   str = new char[20];
   strcpy(str, ca.str);
}
实在危险:如果str未被初始化或已经被delete了,则发生致命错误。
(2) 方法二:
A::operator=(const A &ca)   
{
   strcpy(str, ca.str);
}
前提条件A:在A的所有构造函数中必须保证已经为str申请了内存。
(3) 方法三:
A::operator=(const A &ca)   
{
   if(str == NULL)
   {
       str = new char[20];
   }
   strcpy(str, ca.str);
}
前提条件B:str在定义时如果未被分配空间则必须初始化为NULL。(因为str在未被分配内存空间时,str是野指针(VC是0xcccccccc),可未必是空指针。)
(4) 结论:方法三是强烈推荐的。 本文链接地址: C++内存泄露的实例源码