2

正如建议的那样:我有一个大于 2 giga 的文件。我正在使用以下函数映射到内存:

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

我解析ptr为接受Ch*. 根据 rapidxml 的文档ptr应该是可修改的,但由于它被声明为类型char*,因此无法这样做。程序可以编译,但在运行时崩溃并出现以下错误:访问冲突。我发现在解析char*. 请问我该如何解决?

4

3 回答 3

3

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

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

于 2010-06-28T20:50:47.803 回答
2

盲猜:ptr大概是NULL。从文档

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

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

于 2010-06-28T20:20:48.843 回答
1

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

更新:

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

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

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

于 2010-06-28T20:25:18.677 回答