我有一個用於Windows Mobile 6 ARMV4I的Visual Studio 2008 C++項目,我正在使用內存映射文件。不幸的是,它會導致設備鎖定。我可以用這個代碼演示了這個問題:MapViewOfFile凍結Windows Mobile 6設備
#include <list>
#include <algorithm>
int _tmain(int argc, _TCHAR* argv[])
{
DWORD alloc_size = 256;
DWORD alloc_max = 16 * 1024 * 1024;
DWORD alloc_count = alloc_max/alloc_size;
HANDLE f = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, alloc_max, NULL);
std::list< void* > l;
for(DWORD i = 0; i < alloc_count; ++i)
{
// device freezes after 65529 iterations
l.push_back(::MapViewOfFile(f, FILE_MAP_READ | FILE_MAP_WRITE, 0, i * alloc_size, alloc_size));
}
std::for_each(l.rbegin(), l.rend(), ::UnmapViewOfFile);
::CloseHandle(f);
return 0;
}
了Windows Mobile 6經典模擬器後會在我的測試65529次反覆凍結。這是我做錯了什麼,或者是否有平臺問題,我應該知道?
感謝, PaulH
編輯:增加到/ STACK:1048576,4096讓我的設備被凍結前打65535次迭代。
編輯2:根據GlobalMemoryStatus
就在故障發生前,設備擁有70.5MB/94.1MB空閒物理內存。
Edit3:我可以創建兩個MMF並將它們加載到65500 * 256字節。但是,它們都不能單獨超過65535個分配。實際上,分配大小並不重要。我可以將它減半,每個減少128字節,但我仍然在65535次迭代中失敗。
編輯4:用實際文件來支持MMF似乎沒有什麼區別。 > 65535次迭代失敗。
爲什麼你沒有得到一個內存不足的例外? – 2011-05-12 16:22:10
@Cory Nelson - 針對Windows Mobile的MapViewOfFile不要求您使用4KB分配粒度> 32位地址。 http://msdn.microsoft.com/en-us/library/aa914405.aspx – PaulH 2011-05-12 16:29:26
好問題。我以前爲Windows Mobile開發過,但從未耗盡內存。我不確定在這種情況下展示什麼行爲。 – 2011-05-12 16:29:38