我已将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时,但这个问题刚刚解决了,但也许它是相关的。
任何人都可以帮助我吗?
答案 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)
看起来您的堆已损坏。检查您是否多次删除已分配的指针。不访问数组的越界元素。不访问已删除的指针等