为什么MapViewOfFile会为rapidxml返回一个不可用的指针?

时间:2010-06-28 20:01:20

标签: c windows char rapidxml memory-mapping

正如所建议的:我有一个大于2千兆的文件。我使用以下函数映射到内存:

char* ptr = (char*) MapViewOfFile( map_handle, 
      FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 0 );

我将ptr解析为接受Ch*的rapidxml。根据来自rapidxml ptr的文档应该是可修改的,但由于它被声明为char*类型,因此无法完成。程序编译,但在运行时它崩溃时出现以下错误:访问冲突。我发现在解析char*时会发生这种情况。我该如何解决这个问题呢?

3 个答案:

答案 0 :(得分:3)

您为MapViewOfFile()的最后一个参数传递0。该参数名为dwNumberOfBytesToMap。由于您选择了零,因此将映射整个2千兆字节。这不能在32位模式下工作,没有足够的虚拟内存可用。 ptr值将为NULL,任何通过指针写入的尝试都将生成AV。

您需要映射文件的各个部分。

答案 1 :(得分:2)

盲目猜测:ptr可能是NULL。来自documentation

  

如果函数失败,则返回   value为NULL。要获得扩展错误   信息,调用GetLastError。

如果您提供更多信息,我们可能会提供更多帮助。检查调试器中的返回值。关于第一个句柄参数map_handleCreateFileMappingOpenFileMapping函数返回此句柄。也许您使用了其他一些功能来处理?

答案 2 :(得分:1)

您的“访问冲突”是内存访问错误。换句话说,您的程序访问了它不拥有的内存。这可能是因为您的解析器尝试读取超出分配给文件的内存范围,或者像jdehaan建议的那样,您的MapViewOfFile函数返回NULL。

UPDATE:

如果MapViewOfFile没有返回NULL,那么问题可能是您正在访问超出映射文件的分配范围。您似乎在对此问题的评论中指出解析操作也通过添加一些终止标记来修改xml文档。这无疑会增加文件的长度,从而在内存中写入文件块的末尾。那会导致你看到的错误。

如果不是这样,那么也许您没有使用正确的访问说明符调用CreateFileMappingMapViewOfFile的文档说,如果您想要一个允许读/写访问的地图视图,则需要在创建文件映射对象时指定PAGE_EXECUTE_READWRITE选项。

如果不是这样,那么我怀疑Hans' answer可能是关键。你在运行什么系统?是32位Windows还是64位?如果文件大于2GB,您将无法映射它。