C++ 尝试打印值时出现错误的\u alloc异常
我已经调试了我的背部,到C++ 尝试打印值时出现错误的\u alloc异常,c++,arrays,new-operator,bad-alloc,C++,Arrays,New Operator,Bad Alloc,我已经调试了我的背部,到MyMesh构造函数。在此代码中: if (hollow) { numTriangles = n*8; triangles=new MyTriangle[numTriangles]; if (smooth) numSurfacePoints=n*8; else numSurfacePoints=n*12; surfacePoints=new SurfacePoint[numSurfacePoints]; }else { nu
MyMesh
构造函数。在此代码中:
if (hollow) {
numTriangles = n*8;
triangles=new MyTriangle[numTriangles];
if (smooth) numSurfacePoints=n*8;
else numSurfacePoints=n*12;
surfacePoints=new SurfacePoint[numSurfacePoints];
}else {
numTriangles = n*4;
triangles=new MyTriangle[numTriangles];
if (smooth){
numSurfacePoints=n*4;
surfacePoints=new SurfacePoint[numSurfacePoints];
surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
}else{
numSurfacePoints=n*6;
surfacePoints=new SurfacePoint[numSurfacePoints];
surfacePoints[n*6]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
surfacePoints[n*6+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
}
}
我正在为网格确定必要的表面点和三角形。布尔“空心”和“平滑”表示,如果我需要在圆锥体上打个洞,或者法线相同,但我认为它是不可逆的
问题是:如果hollow==false,它会出错,但不会崩溃,它甚至允许将值放入数组中,但当我尝试这样做时:
for(int i=0;i<numSurfacePoints;i++){
std::cout<<"vertex "<<i<<"-> pos:"<<surfacePoints[i].pos.x<<" "<<
surfacePoints[i].pos.y<<" "<<surfacePoints[i].pos.z<<
" norm:"<<surfacePoints[i].norm.x<<" "<<surfacePoints[i].norm.y<<
" "<<surfacePoints[i].norm.z<<"\n";
}
对于(int i=0;i多少是n
?这是曲面点数量的计算公式…多少是n
?这是曲面点数量的计算公式…您正在为n个曲面点分配内存
那么,如何为第N个点和第N+1个点赋值呢
请检查数组外的绑定条件…您正在为N个曲面点分配内存
那么,如何为第N个点和第N+1个点赋值呢
请检查是否存在数组外绑定条件…您正在分配的内存外写入
与
您可以使用的有效索引范围是[0…(n*4-1)](例如,对于n=10,您可以使用索引[0..39])
但后来你写了
surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
这两种情况都超出了这一范围(平滑情况下也是如此),也就是说,对于n==10,写入索引40和41
因此,您正在破坏堆(内存是“新”的来源)。根据内存布局(从一次运行到下一次运行可能有所不同),您将覆盖属于其他人(堆或程序的另一部分)的数据。根据布局,它将立即崩溃,或为以后的崩溃或问题埋下种子
在您的情况下,当您执行输出时,运行库还将分配(调用malloc或new)以获取一些内存,堆系统会注意到有问题(您重写了堆系统管理内存块所需的一些数据)并引发异常。您正在分配的内存之外写入
与
您可以使用的有效索引范围是[0…(n*4-1)](例如,对于n=10,您可以使用索引[0..39])
但后来你写了
surfacePoints[n*4]=SurfacePoint(vector3(0,0,1),vector3(0,0,1));
surfacePoints[n*4+1]=SurfacePoint(vector3(0,0,-1),vector3(0,0,-1));
这两种情况都超出了这一范围(平滑情况下也是如此),也就是说,对于n==10,写入索引40和41
因此,您正在破坏堆(内存是“新”的来源)。根据内存布局(从一次运行到下一次运行可能有所不同),您将覆盖属于其他人(堆或程序的另一部分)的数据。根据布局,它将立即崩溃,或为以后的崩溃或问题埋下种子
在您的情况下,当您执行输出时,运行库还将分配(调用malloc或new)以获取一些内存,堆系统会注意到有问题(您重写了堆系统管理内存块所需的一些数据)并引发异常。堆似乎已损坏。请检查是否多次删除分配的指针。是否访问数组的越界元素。是否访问已删除的指针等。堆似乎已损坏。检查是否多次删除分配的指针。是否访问数组的边界元素。不访问删除的指针,等等。例如4。但是如果它不是空的,那么即使是20也可以例如4。但是如果它不是空的,那么即使是20也可以。如果空心==false,你能写下你在做什么吗?如果空心==false,你能写下你在做什么吗?哦,非常感谢!我一直在找它呃,但它是这个基本的…呸…无论如何,非常感谢!哦,非常感谢!我找了好几个小时,但它是这个基本的…呸…无论如何,非常感谢!