c++ - 大数组的 ba​​d_alloc

标签 c++ arrays out-of-memory

我在 C++ 中遇到内存分配问题。请看下面的代码:

int main()
{
    std::vector<BYTE *> v;
    srand(GetTickCount());
    // Load a document and free it.
    int nDocSize = 1500;
    while (nSize <= 1024 * 1024 * nDocSize)
    {
        int n = rand() % (1024 * 1024) + 1;
        v.push_back(new BYTE[n]);
        nSize += n;
    }
    for (auto itArr = v.begin(); itArr != v.end(); ++itArr)
    {
        delete[] * itArr;
    }
    // Load an image.
    BYTE *data = new BYTE[1024 * 1024 * 500];
    delete[] data;

    return 0;
}

我正在分配总大小为 1.5GB 的对象。在释放后我试图分配一个大小为 500MB 的数组时程序崩溃(bad_alloc 异常)。

但此代码不会因 nDocSize 的较低值而崩溃,例如 500。您能否解释一下导致 bad_alloc 异常的原因以及如何解决此问题?对于从 PDF 加载的图像,我需要如此大的数组。

我使用 Visual Studio 2015,它在 x86 应用程序中崩溃。

最佳答案

MSVC 声称任何请求内存超过 0x80000000 的新语句都会失败。顺便说一句,分配一整 block 大内存也有点 Not Acceptable ,现在是按 vector 进行的。

你可以选择deque<>,它通常管理一系列连续的内存块,每个 block 可能更小,扩展它的容量也更便宜。您也可以自己管理内存。

关于c++ - 大数组的 ba​​d_alloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43683406/

相关文章:

C++ g++ 在类头文件中找不到 'string' 类型

c++ - 如何对作为参数传递的数组进行排序?

java - 如何监听 OutOfMemoryError 并退出 JVM

Android/Java 使用 cipher.getOutputSize() 分配字节时内存不足 "OutOfMemoryError"

c++ - Windows 经典主题上消失的单选按钮

c++ - 重载 * 运算符时无法转换错误

c++ - 字符串前应为 ')'

python - 将自定义函数应用于 numpy 中的 2 行或更多行(或列)

python - 如何将数组传递给使用 python 用 c 编写的共享库 (.dll)

java - MALLET 主题建模 OutOfMemoryError