C++ 为什么我的代码中有std::bad_alloc?

C++ 为什么我的代码中有std::bad_alloc?,c++,memory,bad-alloc,C++,Memory,Bad Alloc,我正在编写一个函数,将数据从文件加载到内存中,这样我就可以根据需要在程序中使用它。数据文件的大小(以字节为单位)从单独的JSON文件读取。这是给我带来问题的相关代码: const uint32_t data_size = json["buffers"][0]["byteLength"].GetUint(); char* data = new char[data_size]; std::ifstream file_bin(path_bin, std::ios::binary); file_bin.

我正在编写一个函数,将数据从文件加载到内存中,这样我就可以根据需要在程序中使用它。数据文件的大小(以字节为单位)从单独的JSON文件读取。这是给我带来问题的相关代码:

const uint32_t data_size = json["buffers"][0]["byteLength"].GetUint();
char* data = new char[data_size];
std::ifstream file_bin(path_bin, std::ios::binary);
file_bin.read(data, data_size);
file_bin.close();
处理完数据后,我使用以下方法将其从内存中删除:

delete[] data;
多次加载数据不会出现问题,我已经验证了没有内存泄漏但是,如果
数据大小过大,有时会导致抛出
std::bad_alloc
。这个问题持续存在,但似乎是随机的;有时我可以在抛出异常之前加载和删除数据几十次,有时在第五次加载时就已经发生了

该错误仅在x86版本中抛出,而不是在x64版本中抛出。因此,我通过动态分配一个int数组进行了一次现实检查,在程序崩溃之前,RAM的使用率达到了1.8GB,这是意料之中的。问题是数据大小甚至不超过1GB。那它为什么会崩溃呢

通过断点的威力,我还检查了
data\u size
没有做任何奇怪的事情:它始终是一个正数,并且永远不会超过可用RAM(程序在该点使用的总量约为100MB)


可以通过捕获异常,然后使用禁止的goto语句尝试再次分配内存来解决此问题;它总是在第二次尝试时起作用。然而,这并不理想;它使代码的可读性稍差,但如果请求的分配太大,它也会导致无限循环,这将导致程序挂起而不返回任何错误。

您使用的是什么操作系统?当然不是答案,但您可以通过多次尝试(2次或3次)来避免无限循环第三次抛出异常?您甚至不需要使用
goto
,只需将其弹出一个循环,甚至可以使用
new(std::nothrow)
检查
nullptr
而不是异常。@Dani我使用的是Windows。@TA不知道新接受的参数,我想我会使用它,以防真的没有其他方法修复此问题。谢谢您可以尝试
VirtualAlloc
在windows上进行大的分配,以绕过堆,这可能会导致大容量的问题。您使用的是什么操作系统?当然不是答案,但您可以通过多次尝试(2或3次)并在第三次抛出异常来避免无限循环?您甚至不需要使用
goto
,只需将其弹出一个循环,甚至可以使用
new(std::nothrow)
检查
nullptr
而不是异常。@Dani我使用的是Windows。@TA不知道新接受的参数,我想我会使用它,以防真的没有其他方法修复此问题。谢谢您可以尝试
VirtualAlloc
在windows上进行大型分配,以绕过堆,这可能会导致大型问题。