--------------------------------------------------------------------------
*整理: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;
}