代码如下
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就删除了什么重要文件?