這個問題困擾我一個多月了,球球大佬們賞光幫我看看吧。
這個程式的目的是讀入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
uj5u.com熱心網友回復:
可以跟蹤除錯一下,看crash到哪一行,或者把dump檔案提供一下uj5u.com熱心網友回復:
那個函式寫錯了,應該這樣LPCWSTR stringtoLPCWSTR(string orig)
{
size_t origsize = orig.length() + 1;
size_t convertedChars = 0;
wchar_t *wcstring = (wchar_t *)malloc(sizeof(wchar_t)*origsize);
mbstowcs_s(&convertedChars,wcstring,origsize,orig.c_str(),_TRUNCATE);
return wcstring;
}
不然會隨機crash,因為會導致堆疊被破壞
uj5u.com熱心網友回復:

L"grid\\NACA0012.cas";
_T("grid\\NACA0012.cas") ;
uj5u.com熱心網友回復:
#include <afx.h>
#include <string>//-------改為小寫的i---------
#include <vector>//-------改為小寫的i---------
#include <iostream>//-------改為小寫的i---------
using namespace std;
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_READONLY,//----改為FILE_ATTRIBUTE_READONLY----
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();
}
VS2015 支持MFC的控制臺除錯
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64554.html
標籤:C++ 語言
