C++中避免内存泄露常见的解决方式
作者:网络转载 发布时间:[ 2015/2/25 15:12:16 ] 推荐标签:C++ 内存泄露
常见内存泄露及解决方式-选自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;
}

sales@spasvo.com