C++ &引用;标准::坏的“所有”:我是否占用了太多的内存?

C++ &引用;标准::坏的“所有”:我是否占用了太多的内存?,c++,bad-alloc,C++,Bad Alloc,信息: terminate called after throwing an instance of 'std::bad_alloc' what(): std::bad_alloc 我查看了gdb回溯,这是我自己实现的最低级别的方法: /* * get an array of vec3s, which will be used for rendering the image */ vec3 *MarchingCubes::getVertexNormalArray(){ // Us

信息:

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc
我查看了gdb回溯,这是我自己实现的最低级别的方法:

/*
 * 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;
}
/*
*获取Vec3数组,用于渲染图像
*/
vec3*MarchingCubes::getVertexNormalArray(){
//使用与getVertexArray相同的数组大小技术:我们希望索引匹配
vec3*array=new vec3[this->meshPoints.getNumFaces()*3];//每个面有3个顶点
int j=0;
for(unsigned int i=0;i<(this->meshPoints.getNumFaces()*3);i++){
realVec normal=this->meshPoints.getNormalForVertex(i);
//PCReal*iter=normal.begin();
如果(正常.size()>=3){
数组[j++]=vec3(正常[0],正常[1],正常[2]);
}
cout(从评论中移动/扩展)

由于您每次都分配一个新数组而没有释放它,因此会出现大量内存泄漏,即您继续向系统请求内存而没有将其返回。最终堆上的空间完成,在下一次分配时,您得到的只是一个
std::bad_alloc
异常

“C风格”的解决方案是,当您不再需要此类内存时(使用
delete[]
),记住释放此类内存,但这是(1)容易出错(例如,如果函数中有多个返回路径)和(2)潜在的异常不安全(如果您有异常,每条指令都会成为潜在的返回路径!).因此,应避免这种方式


< > >习惯性C++解决方案是使用封装指针的小对象,并在销毁或标准容器时释放相关联的内存,这些容器做的事情差不多,但有复制语义和更多的铃声和哨子(包括存储数组内的大小)。

double myArray=新的双精度[-9000]


以防对任何人都有帮助。

您是否使用
delete[]释放过此函数返回的数组。
meshPoints.getNumFaces()有多大<代码> > VEC3?ouk,那么你就有大量的内存泄漏。顺便说一下,你应该使用或标准容器;你应该避免C++中完全手动的内存管理,你的代码不会异常安全,你总是会冒内存泄漏的风险。你不应该在返回之前删除数组,你应该删除它。当不再需要它时。也就是说,在调用函数的代码中的某个地方。将其视为黑板:您在黑板上写入数据,但从不擦黑板来为新数据腾出位置(
delete[]
)。如果你这样做足够长的时间,有时黑板上就没有地方了。但是你不应该擦黑板上你仍然需要的东西,而应该擦不再需要的东西。另一个想法,完全不同的方向:你检查过
j
始终保持在
meshPoint.getNumFaces()下面吗*3
?由于缓冲区溢出覆盖了基本堆结构,可能会出现
错误的alloc
。这并不能解释std::bad_alloc异常:运算符new和运算符new[]的标准定义引发的异常类型当他们无法分配请求的存储空间时。好的,所以当我搜索错误时,我发现了这个问题,我不知道我在搜索时试图分配一个负长度数组,所以我永远不会找到其他答案。这里的答案不能解决我的问题。问题标题仅说明“std::bad\u alloc”“我是否使用了太多内存?”-对此,我可以肯定地回答“你确定你没有尝试创建一个长度为负的数组吗?”。请随意否决投票,但我还是将我的答案留在这里。“这里的答案不能解决我的问题。”"这是因为这是一个不同的问题。一个问题不仅仅是它的标题。这不是问题的答案,将被删除。不,这是由于取消分配。OP是错误的,正如在该答案下的评论中所解释的。越界访问不会导致
std::bad_alloc
。那么它仍然不会导致
std::bad_alloc
您没有试图分配任何具有访问权限的内容。OP的代码中存在巨大的内存泄漏,这是分配失败的明显原因。