Windows Mobile 6 용 ARM 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;
}
윈도우 모바일 6 클래식 에뮬레이터 내 테스트에서 65,529 반복 한 후 동결됩니다. 이 문제가 제가 잘못하고있는 것이거나 알고 있어야하는 플랫폼 문제입니까?
덕분에, PaulH
편집 :은/STACK에 증가 : 1048576,4096 나 장치가 정지하기 전에 65535 반복을 공격 할 수 있습니다.
편집 2 : 오류가 발생하기 바로 전에 GlobalMemoryStatus
에 따르면 장치의 실제 메모리는 70.5MB/94.1MB입니다.
편집 3 : 두 개의 MMF를 만들고 최대 65500 * 256 바이트까지로드 할 수 있습니다. 그러나 그들 중 누구도 개별적으로 65535 할당을 초과 할 수 없습니다. 사실, 할당 크기는 중요하지 않습니다. 각각 128 바이트로 반으로 줄일 수는 있지만 여전히 65535 회 이상의 반복에서 실패합니다.
Edit4 : 실제 파일로 MMF를 백업해도 아무런 효과가 없습니다. > 65535 반복의 실패.
왜 메모리 부족 예외가 발생합니까? –
@Cory Nelson - Windows Mobile 용 MapViewOfFile에서는> 32 비트 주소에 대해 4KB 할당 세분성을 사용할 필요가 없습니다. http://msdn.microsoft.com/en-us/library/aa914405.aspx – PaulH
좋은 질문입니다. 전에 Windows Mobile 용으로 개발했지만 메모리가 부족한 적은 한번도 없었습니다.그 상황에서 어떤 행동을 보여줄지 모르겠습니다. –