尝试打印值时出现bad_alloc异常

时间:2009-11-19 11:09:35

标签: c++ arrays new-operator bad-alloc

我已将other problem调试回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。 bool“空心”和“平滑”表示,如果我需要在锥体上有一个洞,或者法线是相同的,但我认为它是无效的。

问题是:如果空洞==假,它做错了,但不会崩溃,它甚至允许将值放在数组中,但是当我试图像这样:

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异常。

另外,有一段时间,当上面的代码段在操作符new上抛出bad_alloc时,但这个问题刚刚解决了,但也许它是相关的。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

然后为N个曲面点分配内存 那么如何为第N和第N + 1点分配值?

请检查数组绑定条件...

答案 1 :(得分: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)来获取它正在做的事情的内存,并且堆系统注意到出了什么问题(你覆盖了堆的一些数据)系统需要管理内存块并抛出异常。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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