我有一个用于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