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