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

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

指向对象的指针数组不同于对象数组

详细:
      释放对象指针数组和释放对象数组的区别
           1.在释放对象数组时,编译器用delete函数(不是delete函数而是delete表达式(感谢网友chu009的指正)-:))中的方括号来控制正确的调用每一个对象的析构函数
           2.若用大小参数来控制正确的调用存储于指针数组中的对象的析构函数是没有用的。因为指针是一种基本数据类型,所以这个大小参数对于析构函数调用是没有用的,所以指针被收回堆里了,但是所有的对象没有被释放,结果就造成了内存泄漏。

例子:
#include<iostream>
#include<cstring>
using namespace std;
class Point
{
private:
 int x;
 int y;
 char *color;;
public:
 Point(int new_x , int new_y , char *col);
 void show()
 {
 cout<<x<<"/n"
  <<y<<"/n"
  <<color<<endl;
 }
 ~Point();
};
 
Point::Point(int new_x, int new_y , char *col)
{
 x=new_x;
 y=new_y;
    color=new char[strlen(col)+1];
    strcpy(color,col);
}

Point ::~Point()
{
 delete color;
}

int main()
{
 Point **p=new Point *[10]; //动态的分配了指向10个Point对象的指针数组(他们本身不是对象)
 
 for(int i=0;i!=10;++i)
 {
  p[i]=new Point(i,i,"Green");
  p[i]->show();
 }
// delete [] p;  //或是delete [10] p;
 /*注意这条语句,它没有释放Point对象,释放的只是它们的指针。结果造成了内存泄漏(sizeof(Point)+60字节的空间)。其中的60个字节是10个对象中的"Green"字符串占用的。*/
 
 //正确的如下:
 for(int j=0;j!=10;++j)
 {
  delete p[j];
 }
 
   delete  p;   //或是delete [] p;

   return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值