2016-12-08 169 views
0

为了简单起见,请考虑这个具有3个属性的类。C++异常:std :: bad_alloc

class Human 
{ 
    public: 
    int id; 
    int age; 
    std::string name; 
}; 

int main() 
{ 
Human *h = new Human[120000]; <-- breaking 
    return 0; 
} 

我得到的错误是在在0x76ACC52F在Human.exe 未处理的异常:微软C++异常:性病:: bad_alloc的内存位置0x000D0EA8。

运行该程序的机器具有32 GB RAM和1 TB硬盘,并且分页打开。人类有大约350个属性。我检查并发现每个Human对象大约需要29000字节。所以总计它应该分配29000 X 120000 = 3.48 GB

我假设这是一个内存问题,程序没有足够的内存来完成新的操作。为什么。 32 GB不是一个小内存。除Visual Studio运行此C++程序外,没有任何其他程序正在运行。

请让我知道你对这个问题的想法和一个可能的解决方案。

非常感谢。

+0

评论不适用于扩展讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/130287/discussion-on-question-by-blue-piranha-c-exception-stdbad-alloc)。 –

回答

0

因此,如注释中所示,以64位编译可解决问题,但您应该使用链接列表而不是数组,因为它不需要连续的内存块。

+2

可能是糟糕的性能方面这么做......将数组分割成一些块可能会更有效率。访问链表中的随机元素是O(n)。 – Asu

+0

...或动态分配''人类'这可能会节省在该连续块的一些空间。 – Asu

相关问题