0

我已经将我的另一个问题调试回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));
    }
}

我正在为网格确定必要的 SurfacePoints 和 Triangles。布尔“空心”和“平滑”表示,如果我需要在圆锥体上打一个洞,或者法线是否相同,但我认为这无关紧要。

问题是:如果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";
}

它会在 i=0 时引发 bad_alloc 异常。

此外,曾经有一段时间,上面的代码段向 operator new 抛出了一个 bad_alloc,但这个问题自己解决了,但也许它是相关的。

有谁能够帮我?

4

4 回答 4

2

您正在为 N 个表面点分配内存,那么如何为第 N 个和第 N+1 个点分配值?

请检查超出数组范围的条件...

于 2009-11-19T11:41:27.630 回答
1

您正在分配的内存之外写入。

    numSurfacePoints=n*4;
    surfacePoints=new SurfacePoint[numSurfacePoints];

您可以使用的有效索引范围是 [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)以获取一些内存用于它正在执行的操作,并且堆系统会注意到出现问题(您覆盖了堆系统需要的一些数据)管理内存块)并引发异常。

于 2009-11-19T11:54:54.633 回答
0

看起来您的堆已损坏。检查您是否没有多次删除分配的指针。不访问数组的越界元素。不访问已删除的指针等。

于 2009-11-19T11:56:22.650 回答
0

多少钱n?那就是surfacePoints的数量由...计算的地方

于 2009-11-19T11:28:54.620 回答