在我的下面的代码中,我有一个DoubleTableEntries结构,它由int和char组成。我得到的代码问题是,当我的大小< = 5000但是当大小值大于6000或9033时,代码运行正常。它开始给我这个错误:
terminate called after throwing an instance of std::bad_alloc
what(): std::bad_alloc
Aborted(core dumped)
当我的尺寸是9033并且这个循环卡在5923时,我得到了上述错误。
我认为在我的情况下内存应该不是一个大问题,因为RAM大小为4GB,并且没有其他大内存消耗程序随之运行。
请指导我如何避免此问题。
struct DoubleTableEntries **NewDoubleTable;
NewDoubleTable = new DoubleTableEntries*[size];
for(int i = 0; i < size; ++i)
{
NewDoubleTable[i] = new DoubleTableEntries[256*256];
}
答案 0 :(得分:5)
您的内存不足,特别是您的流程允许的虚拟地址空间。
5923 * (256 * 256) * 8B ~= 3GiB.
32
位操作系统将仅允许每个进程的2
和3
GiB虚拟地址空间之间的某个位置,并且将拒绝尝试使用此异常分配更多。
如果您正在运行64
位操作系统并构建64
位可执行文件,则可能达到了交换限制,这会导致相同的错误。
此时您的选择是构建一个64位二进制文件(如果您使用的是64位操作系统),它仍将围绕您的样本大小进行磁盘交换,或者在可能的情况下重新处理您的系统一次只有256^2 * 8B = 0.5 MiB
个表。