簡體   English   中英

僅使用600 MB內存時,調整QByteArray的大小會拋出std :: bad_alloc

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM