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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |