2011-12-22 2 views
2

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

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

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

Спасибо,

Ian

ответ

6

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

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

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

+0

Хорошо, спасибо. Это все. – Ian