Относится к использованию общей памяти с CreateFileMapping и MapViewofFile - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть 2 вопроса по поводу использования общей памяти. Я использую CreateFileMapping для создания области общей памяти между двумя процессами.

1) Я понимаю, что мне нужно вызывать CloseHandle для каждого дескриптора, возвращаемого из вызова CreateFileMapping или OpenFileMapping, чтобы освободить память. Мой вопрос: все ли дескрипторы закрываются надлежащим образом и освобождаются ли они в Windows XP / 7, если программы, использующие общую память, завершают работу без вызова CloseHandle? IE - есть ли вероятность утечки памяти после того, как все процессы, использующие память, были закрыты?

2) Я использую MapViewofFile, чтобы получить указатель на mem. В одном случае я предполагал, что разделяемая память всегда будет существовать в контексте метода. Поэтому я сохранил возвращаемое значение MapViewOfFile в качестве указателя и закрыл дескриптор для mem, и я просто использую указатель на общий мем (но все еще блокирую доступ к нему). Это безопасно, или я должен вызывать MapViewOfFile каждый раз, когда я получаю доступ к общей папке?

Спасибо

Ian

1 Ответ

7 голосов
/ 22 декабря 2011

1) Да, все дескрипторы закрываются, когда процесс завершается, независимо от того, хорошо ли он умирает или заканчивается. Здесь нет утечек.

2) Пока вы не вызовете UnmapViewOfFile, память все равно будет доступна для процесса, даже если дескриптор был закрыт:

Хотя приложение может закрыть дескриптор файла, использованный для создания объекта сопоставления файлов, система удерживает соответствующий файл открытым до тех пор, пока не будет отображено последнее представление файла

...