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