![](/img/trans.png)
[英]code throws std::bad_alloc, not enough memory or can it be a bug?
[英]Resizing QByteArray throws std::bad_alloc when only using 600 MB of memory
我是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。
AFAIK QByteArray
分配連續的內存塊。 雖然您的應用程序可能仍有大量可用的虛擬內存,但是您的陣列所分配的當前內存塊很可能無法進一步擴展,因為您的內存管理器沒有足夠大的連續塊。
如果你需要處理一些大文件,而不是分配內存並將它們加載到一個塊的內存中,我建議查看將“視口”映射到文件中並以這種方式處理的內存。 根據文件的大小,您可能能夠將整個文件的內存映射到一個塊中的內存中。 這在Windows上比在逐字節加載文件時效率更高,因為它利用虛擬內存系統在相關文件中進行分頁。
在Windows上,32位進程可以擁有2 GB的堆內存。 如果此內存不包含足以處理Bytearray的連續塊,則會遇到錯誤的分配異常。
MSVC知道/ LARGEADDRESSAWARE(處理大地址)和/ HEAP(設置堆大小)鏈接器選項。
您可以檢查對這些更改是否會影響您可能一次分配的字節數。
在我的x64機器上,在MSVC2012上使用/ MACHINE:X86編譯的可執行文件為> = 1200MB的單個分配引發了錯誤的alloc異常。
如果我將/LARGEADDRESSAWARE
添加到Linker命令行,程序將繼續運行,直到它在eating 2100MB
后崩潰。
如果我使用/ MACHINE:X64編譯,則進程將塊分配給8000MB而沒有任何異常(可能更多,但我只測試直到8GB)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.