我搜索了有关“std :: bad_alloc”的着名错误,但我找不到像我这样的情况。 我已经在c ++中实现了一个代码(准确地说:在Win7 Prof.中使用Eclipse在MinGW中运行)并且代码对于少量类实例运行良好,但是当类实例的数量达到10509以上时,错误来自windows出现然后eclipse显示'std :: bad_alloc'错误。 我使用“new”来构建新的类实例,每个类需要两个指针和三个类型为“long int”,“string”和“int”的变量。 我无法解构之前构建的任何实例,因为我以后需要它们作为节点在程序的其他部分进行评估。但是,无论如何,我已经将类解构器添加到类定义中,并且它们设置正确。 我确定程序何时以及通过哪个命令停止,这正是在尝试添加第10510个类实例时正确构造10509个类实例之后。
所以我想知道是否可以扩展保留内存以分配新的类实例?
代码太长,无法在此处粘贴。 谢谢你的帮助!
答案 0 :(得分:2)
首先,new
工作的动态内存通常会占用进程中所有剩余的可用内存。没有办法进一步扩展它。您最初拥有多少动态内存取决于您的程序具有多少非动态数据。如果不了解更多关于你的计划的话,没有办法说出来。通过减少非动态数据的大小,您可以有效地“扩展”可用作动态内存的内容。
其次,在具有虚拟内存的平台上,实际上不可能“耗尽内存”(假设您有一个健康的交换文件)。但是你可以用完进程地址空间。同样,如果在仅分配10509
个对象后用完了地址空间,则必须有其他错误。
第三,10509
看起来非常低。因此,如果在分配如此少的对象后内存不足,则可能意味着对象本身相当大。你的物体有多大?
第四,动态内存分配错误可能由堆损坏触发,这意味着即使技术上仍有足够的可用内存,分配也会失败。如果不了解您的代码,就没有办法说出来。