加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 仅使用600 MB内存时,调整QByteArray的大小会抛出std :: bad

发布时间:2020-12-16 09:45:42 所属栏目:百科 来源:网络整理
导读:我是Qt的新手,需要加载和处理一些大文件.相反,我的内存耗尽.以下代码说明了我的问题: QByteArray mem;for(int i=1; i=20; ++i){ std::cout "eating " (i * 100) "MB"; mem.resize(i * 100 * 1024 * 1024);} 当它达到600MB时我得到std :: bad_alloc.这真的不
我是Qt的新手,需要加载和处理一些大文件.相反,我的内存耗尽.以下代码说明了我的问题:

QByteArray mem;
for(int i=1; i<=20; ++i)
{
    std::cout << "eating " << (i * 100) << "MB";
    mem.resize(i * 100 * 1024 * 1024);
}

当它达到600MB时我得到std :: bad_alloc.这真的不应该发生.
是否有秘密切换来增加堆大小?

我在Windows和Visual C 10.0 x86编译器上使用Qt 5.0.2.

解决方法

在Windows上,32位进程可以拥有2 GB的堆内存.如果此内存不包含足以处理Bytearray的连续块,则会遇到错误的分配异常.

MSVC知道/LARGEADDRESSAWARE (Handle Large Addresses)和/HEAP (Set Heap Size) Linker选项.

您可以检查对这些更改是否会影响您可能一次分配的字节数.

在我的x64机器上,在MSVC2012上使用/ MACHINE:X86编译的可执行文件为单次分配> = 1200MB引发了错误的alloc异常.

如果我将/ LARGEADDRESSAWARE添加到Linker命令行,程序将继续运行,直到它在吃完2100MB后崩溃.

如果我使用/ MACHINE:X64编译,则进程将块分配给8000MB而没有任何异常(可能更多,但我只测试直到8GB).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读