这个问题困扰我一个多月了,球球大佬们赏光帮我看看吧。
这个程序的目的是读入Fluent的计算结果和网格到内存,一开始用的文件流,我嫌太慢就看到晚上说可以用内存映射。
现在的问题是内存映射的代码偶尔会报错,我自己找了很久最后定位到如下代码:
#include <afx.h>
#Include <string>
#Include <vector>
#Include <iostream>
using namespace std;
//从网上找的 string 2 LPCWSTR 类型转换
LPCWSTR stringtoLPCWSTR(string orig)
{
size_t origsize = orig.length() + 1;
size_t convertedChars = 0;
wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*orig.size() - 1);
mbstowcs_s(&convertedChars,wcstring,origsize,orig.c_str(),_TRUNCATE);
return wcstring;
}
void main()
{
HANDLE fileHandle = NULL, fileMapHandle = NULL;
LPCWSTR = nameString = stringtoLPCWSTR("grid\\NACA0012.cas");
//创建文件对象,从网上学的
fileHandle = CreateFile(nameString,
GENERIC_READ,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_READONTLY,
NULL);
if(fileHandle == INVALID_HANDLE_VALUE)
{
//报错
}
//触发内存冲突的代码
//这段代码经过简化,大概的内容和变量是一致的
//并且省略了一些已经排除没有问题的语句
//!最终找到的,会触发内存泄漏的位置就在创建文件对象之后
//记录想要找到的内容所在文本行数
vector<int> lineRecorder;
//从文本中获取每行的内容,这里用固定的字符串代替了
string currentLine = "asdasdasdasdasdasdasd";
//用循环模拟读入文本的过程
for(int i=0;i<100;i++)
{
//if(一些判断)
//此处省略判断
//引发内存冲突的位置
//如果出现内存冲突,循环通常都运行到第 9 次,即下面的cout输出 8/100
lineRecorder.push_back(i);
cout<<i<<" / "<<100<<'\r';
}
getchar();
}
//后面的也省略了
}
报错信息:
事件名称:APPCRASH
故障模块:ntdll.dll
异常代码:c0000005
异常偏移:000000000002a1c5
球大佬们捞一下,看有没有解决办法,已经挂悬赏了,提前谢谢大家赏光!
是不是内存不足,或者文件锁定,或者文件不存在(因为你指定了OPEN_EXISTING)
看上去跟文件大小、内存使用有关。有两个关键点没有讲清楚:1.文件多大。2.读入之后是否占用大量内存,如果是,现在的内存表达方式是什么。