6

我想知道这个代码片段是否:

HANDLE fhandle = CreateFile("something.c", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE mapping = CreateFileMapping(fhandle, NULL, PAGE_READONLY, 0, 0, NULL);
LPVOID map_view = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);

以下释放对象的顺序是有效的:

CloseHandle(mapping);
CloseHandle(fhandle);
UnmapViewOfFile(contents);

即我可以先关闭文件句柄然后再调用UnmapViewOfFile吗?

我知道CloseHandle(mapping)andUnmapViewOfFile(contents)的执行顺序无关紧要,但是关闭文件句柄呢?

我问是因为我只想将map_view指针用于析构函数。在我看来,这可行,并且文件一直保存到UnmapViewOfFile被调用,但这可能会导致一些奇怪的行为?

4

1 回答 1

15

UnmapViewOfFile的文档解释说:

尽管应用程序可能会关闭用于创建文件映射对象的文件句柄,但系统会保持相应文件处于打开状态,直到文件的最后一个视图未映射。

所以是的,关闭文件句柄并仍然使用从该文件句柄创建的文件映射对象是安全的。但是,共享限制有一些影响:

最后一个视图尚未取消映射的文件保持打开状态,没有共享限制。

如果您最初打开带有共享限制的文件句柄,则这些共享限制不会由内部句柄维护。您必须决定这在您的特定场景中是否允许。


虽然没有特别要求,但关闭仍然映射的文件映射对象也是安全的。从CreateFileMapping

文件映射对象的映射视图维护对该对象的内部引用,并且文件映射对象在对它的所有引用都被释放之前不会关闭。因此,要完全关闭文件映射对象,应用程序必须通过调用UnmapViewOfFile取消映射文件映射对象的所有映射视图,并通过调用CloseHandle关闭文件映射对象句柄。这些函数可以按任何顺序调用。

于 2016-04-08T08:47:27.053 回答