メモリマップトファイルを使用しているWindowsMobile6ARMV4I用のVisualStudio2008C++プロジェクトがあります。残念ながら、デバイスがロックする原因になります。このコードで問題を示すことができます:
#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;
}
私のテストでは、65529回の反復後にWindowsMobile6クラシックエミュレーターがフリーズします。これは私が間違って行っていることですか、それとも私が知っておくべきプラットフォームの問題がありますか?
ありがとう、PaulH
編集: / STACK:1048576,4096に増やすと、デバイスがフリーズする前に65535回の反復をヒットできます。
Edit2:GlobalMemoryStatus
障害の直前によると、デバイスには70.5MB/94.1MBの空き物理メモリがあります。
Edit3:2つのMMFを作成し、両方を最大65500*256バイトでロードできます。ただし、どちらも個別に65535の割り当てを超えることはできません。実際には、割り当てサイズは重要ではありません。それぞれ半分から128バイトにカットできますが、それでも65535を超える反復で失敗します。
Edit4:実際のファイルでMMFをバックアップしても、違いはないようです。>65535回の反復での失敗。