关于对象指针数组的析构

如果a是已经定义好的一个类,有如下定义语句:a *p[5],则当类对象数组指针p离开它的作用域时,系统自动调用类a的析构函数0次。
为什么是0次????

在C++中编译器在临时对象**离开其作用域时**自动调用对象的析构函数。

理解上面这句话就可以很好的解释你的问题了。
例如在下面这段代码中

class A{
    int i;
}

void func(){
    A *p[5];  //创建指针数组
    A a;  //局部变量(对象)
    p[0] = &a;  //指针可以指向局部变量
    p[1] = new A;  //也可以不是指向局部变量
    return;  //局部对象被析构
}

 int main(){
    func();
    return 0;
 }

在func函数调用返回,回到main函数时,**局部变量所占的内存空间被释放,局部对象被析构**。数组p占用的空间被释放(但是它所指的变量所占空间不会因此被释放,所指对象也不会被析构,因为**所指对象不一定是局部对象**);对象a是局部对象,因此被析构,所占空间被释放,但这和数组p没有任何关系,被析构的原因仅仅因为它是局部变量,然而恰好p中有一个元素指向了它而已。p[1]所指对象是动态分配的,**不是局部对象**,不会被析构。

a *p[5]这样的写法表示的是p是一个指针数组,每个元素都是指向a对象的指针。
你这样想:a *a1;离开作用域会调用析构吗?显然不会

你这种情况下析构函数得手动调用哦。

a *p[5] 是指针数组,出作用域时就是指针销毁和指针指向的内容没有关系