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,你能写下你在做什么吗?哦,非常感谢!我一直在找它呃,但它是这个基本的…呸…无论如何,非常感谢!哦,非常感谢!我找了好几个小时,但它是这个基本的…呸…无论如何,非常感谢!