消息:
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
我查看了gdb backtrace,这是我自己实现的最低级别方法:
/*
* get an array of vec3s, which will be used for rendering the image
*/
vec3 *MarchingCubes::getVertexNormalArray(){
// Used the same array size technique as getVertexArray: we want indices to match up
vec3 *array = new vec3[this->meshPoints.getNumFaces() * 3]; //3 vertices per face
int j=0;
for (unsigned int i=0; i < (this->meshPoints.getNumFaces() * 3); i++) {
realVec normal = this->meshPoints.getNormalForVertex(i);
// PCReal* iter = normal.begin();
if (normal.size() >= 3) {
array[j++] = vec3(normal[0], normal[1], normal[2]);
}
cout << i << " ";
}
return array;
}
您在上面看到的cout语句表明它在7000次迭代后终止。 上面的函数只在我的应用程序结束时调用一次。在调用上面的函数之前,我调用了一个非常相似的函数,这不会导致问题。
答案 0 :(得分:22)
(从评论中移动/扩展)
由于您每次都要分配一个新数组而不解除分配,因此会出现大量内存泄漏,即您继续向系统询问内存而不会将其恢复。最终堆上的空间结束,在下一次分配时,你得到的只是std::bad_alloc
异常。
&#34; C风格&#34;解决方案是记住在你不再需要时释放这些内存(使用delete[]
),但是,这是(1)容易出错(想想例如,如果你在函数内有多个返回路径)和(2)潜在的异常 - 不安全(如果你有异常,每条指令都成为潜在的返回路径!)。因此,应该避免这种方式。
惯用的C ++解决方案是使用smart pointers - 封装指针的小对象,并在销毁它们时释放相关的内存 - 或标准容器,它们或多或少地使用复制语义和一些更多的花里胡哨(包括在其中存储数组的大小)。
答案 1 :(得分:4)
我在尝试分配负长度数组时遇到此错误:
double myArray = new double [-9000];
以防它可以帮助任何人。
答案 2 :(得分:3)
我的问题是this->meshPoints.getNormalForVertex(i)
访问长度小于this->meshPoints.getNumFaces() * 3
的数组(或矢量,我记不住了)。所以这是访问界限。