常见内存泄露及解决方式-选自ood启发录
  new/delete, array new/arrray delete匹配
  case 1:
  在类的构造函数与析构函数中没有匹配地调用 new/delete!
  解决方法:检查构造函数,在出现new的情况下,按相反的顺序在析构函数中匹配加入delete!
  这里有两个意思:
  1〉new与delete匹配,array new/array delete匹配;
  2〉出如今前面的new要比出如今后面的new后匹配各自的delete;
  比方:
  构造函数:
  m_x = new int[10];
  ...
  m_y = new CString;
  则析构函数:
  delete m_y;
  ...
  delete []m_x; // 对于基本数据类型,用delete也能够,但为了统一,还        // 是用array delete
  case 2:
  没有正确地清除嵌套的对象指针
  也是说,某个对象以引用语义(指针)了包括还有一个对象,而不是以值的方式。
  解决的方法:
  1〉养成好的成对编码习惯:
  在外部函数分配的堆内存,不要在调用函数里面释放,而在外部函数内释放;
  2〉尽量在构造函数里面分配内存,并注意不要犯case 1错误;
  3〉在基类/继承类各管各的内存;(详细解析见以下的case 8)
for example:
#include <iostream>
#include <string>
// Melon : 甜瓜,西瓜;
class Melon
{
public:
Melon(char * var);
~Melon();
void print(void);
protected:
private:
char * m_variety;
};
Melon::Melon(char * var)
{
m_variety = new char[strlen(var) + 1];
strcpy(m_variety, var);
}
Melon::~Melon()
{
delete m_variety;
}
void Melon::print()
{
std::cout << "I'm a " << m_variety << "Melon/n";
}
// Meal : 进餐;
class Meal
{
public:
Meal(char * var, char * res);
~Meal();
void print(void);
protected:
private:
char * m_reastaurant; //     饭店
Melon * m_pMelon;
// 方法2
// Melon m_Melon;
};
Meal::Meal(char * var, char * res)
// 方法2:改引用为值包括;
// : m_Melon(var)
{
m_pMelon = new Melon(var);
m_reastaurant = new char[strlen(res) + 1];
strcpy(m_reastaurant, res);
}
Meal::~Meal()
{
delete m_reastaurant;
delete m_pMelon; // 改动方法1;
}
void Meal::print()
{
std::cout << "I'am a Meal owned by ";
m_pMelon->print();
// 方法2
//m_Melon.print();
}
int main(...)
{
cout << "case 2:/n";
Meal m1("Honeydew", "Four Seasons"); // 蜜汁,四季饭店;
Meal m2("Cantaloup", "Brook Manor Pub"); //     香瓜, 小溪家园酒吧;
m1.print();
m2.print();
return 0;
}