对象数组在释放的时候,经常会遇到两种情况,可能会造成内存泄漏:
例如,GeoPoint是一个类:
class GeoPoint
{
public:
GeoPoint(){};
GeoPoint (double x, double y){dx = x; dy = y;};
~GeoPoint(){};
public:
void SetX(double x){dx = x;};
void SetY(double y){dy = y;};
double GetX(){return dx;};
double GetY(){return dy;};
private:
double dx;
double dy;
};
第一种情况(可能经常遇到):
GeoPoint *object = new GeoPoint[3];
delete object; //错误,因为此时释放掉的只是object[0]的内存(编译器以&object[0]的地址为参数调用一次析构函数),
//等同于delete[1] object;
delete []object;//正确,或者delete [3]object也行
GeoPoint **Obj = new GeoPoint *[3];//只是动态的分配了3个Obj对象的指针数组,但它们本身并不是对象
//分配内存
for(int i = 0; i < 3; ++i)
{
Obj[i] = new GeoPoint();
}
delete []Obj;//错误,此时delete只是指针而非其指向的对象。
//要这样做才正确:
for(int i = 0; i < 3; ++i)
{
delete Obj[i];
}
delete Obj;