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

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

在释放对象数组时在delete中没有使用方括号

详细:
    delete函数中方括号的使用,比如说,delete [] p 和 delete p 是不同的。
1.释放单个对象、单个基本数据类型(例如:int,char,short)的变量或是基本数据类型的数组不需要大小参数,释放定义了析构函数的对象数组才需要这个参数。
2.方括号是告诉编译器这个指针指向的是一个对象向量,同时也告诉编译器正确的对象的地址值并调用对象的析构函数。如果没有方括号,那么这个指针就是默认为是只指向一个对象,对象数组中的其他对象的析构函数就不会被调用,结果就造成了内存泄漏。
3.如果在方括号中间放了一个比对象数组的大小还大的数字,那么编译器就会调用无效对象(内存溢出)的析构函数,会造成堆的崩溃。
4.如果方括号中间的数字值比对象数组的大小小的话,编译器就不能调用足够多个的析构函数,结构会造成内存泄漏。

注意:在所有的因为缺少方括号而造成的内存泄漏的情况中,类占用的内存(大小为sizeof(class name))会被放回堆中,这是由new和delete的性质决定的。

例子:
//此代码演示了与释放动态分配的Point对象数组相关的内存泄漏问题
#include<iostream>
#include<string>
using namespace std;
class Point
{
private:
 int x;
 int y;
 char *color;;
public:
 Point(int new_x=0 , int new_y=0 , char *col="Red");
 ~Point();
};

Point::Point(int new_x=0 , int new_y=0 , char *col="Red")
{
 x=new_x;
 y=new_y;
    color=new char[strlen(col)+1];
    strcpy(color,col);
}

Point::~Point()
{
 delete color;
 cout<<"In the destructor"<<endl;
}

int main()
{
 Point *p=new Point[5];   //注意这里是新建5个对象

// delete p;
 /*注意,这里缺少方括号。没有了方括号,这一语句就等同于 delete [1] p 。编译器将只以&p[0]的地址作为参数调用一次析构函数。*/
//正确的是:
   delete [] p;   //或是 delete [5] p;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值