c++中的常见泄漏(二)

-------------------------------------------------------------------------- 
*整理:Zsm。
*时间:2011-4-15。
*出处:http://blog.csdn.net/Zsm0107
-----------------------------------------------------------------------------------

        没有正确的清除嵌套的对象指针

详细:
    一个对象以引用的方式包含了另一个对象,而不是用值的方式。只有一个对象以值方式包含另一个对象的时候才会自动的调用另一个对象的析构函数。

例子:
#include<iostream>
#include<string>
using namespace std;
class Melon
{
private:
 char *variety;
public:
    Melon(char *var);
    ~Melon();
    void print();
};

Melon::Melon(char *var)
{
 variety=new char[strlen(var)+1];
 strcpy(variety,var);
}

Melon::~Melon()
{
 delete variety;
}

void Melon::print()
{
 cout<<"I'm a "<<variety<<"Melon"<<endl;
}

class Meal
{
private:
 char *restaurant;
 Melon *m;
public:
  Meal(char *var , char *res);
  ~Meal();
  void print();
};

Meal::Meal(char *var , char *res)
{
 m=new Melon(var);
 restaurant=new char[strlen(res)+1];
 strcpy(restaurant , res);
}

//哎呀,没有释放甜瓜。如果甜瓜是作为一个被包含的对象的话,就不会是这样子了。
Meal::~Meal()
{
 delete restaurant;
}

//正确的析构函数如下:
/*
Meal ::~Meal()
{
 delete restaurant;
 delete m;
}
*/
void Meal::print()
{
 cout<<"I'm a Meal owed by";
 m->print();
}

int main()
{
 Meal m1("Honeydew" ,"Four Seasons ");
 Meal m2("Cantaloup" ,"Brook Manor Pub");

 m1.print();
 m2.print();

 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值