请问这道c++编程题调试时为什么会出错?

图片说明
代码如下

struct FPT3D {
float x, y, z;
};

class CGrp {
public:CGrp() { m_ptsum = 0;m_pXYZ = 0;
m_ptsum = m_color = m_lineType = 0;};
virtual ~CGrp() { if (m_pXYZ)delete[]m_pXYZ; }
int m_ptsum;
int m_color;
int m_lineType;
FPT3D* m_pXYZ;
};

int main() {

CGrp p[100];
p[0].m_ptsum = 2;p[0].m_lineType = 2;p[0].m_color = 1;  
p[0].m_pXYZ[0].x = 1.3; p[0].m_pXYZ[0].y = 3.5; p[0].m_pXYZ[0].z = 9;

}

你的代码里面我都没看到new,怎么就有了delete
m_pXYZ = 0;
修改为
m_pXYZ = new FPT3D[100];
看看

if (m_pXYZ)delete[]m_pXYZ;
->
if (m_pXYZ){delete[]m_pXYZ;m_pXYZ =NULL;}

段错误,访问了不该访问的空间。

virtual ~CGrp() { if (m_pXYZ)delete[]m_pXYZ; }

delete只能释放new在堆上分配的空间,free()只能释放malloc()/calloc()/realloc()在堆上分配的空间
此外,导致段错误的原因还有...

 //数组越界
int a[3];
a[3] = 1;//a[3]的可用下标是a[0],a[1],a[2],而a[3]是不合法的。

//堆栈溢出
void ha(int a)
{
    return ha(a - 1); //这不作死吗?系统栈空间不够大!
}

//其它指针错误
int *p;
p = 2000;//啊?还有这种操作?你不怕再来个*p=10就删除了什么重要文件?