1

マルチスレッドプログラムを作成しようとしています。
正常にコンパイルできますが、プログラムが常にクラッシュします。

これが私のコードスニペットです:

// in global declaration
typedef struct MyData {
    int nSumber;
    char *szFileName;
} MYDATA, *PMYDATA;

PMYDATA pData[MAX_THREAD];

// in my OpenDialog function
OPENFILENAME ofn;
char szFile[MAX_PATH];
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
if(GetOpenFileName(&ofn))
    // I think this line that makes my program crash
    pData[0]->szFileName = ofn.lpstrFile;

私はそれを間違っていますか?

前もって感謝します!

4

3 に答える 3

2

pData配列には、まだメモリを割り当てていないため、有効なメモリを指していないポインタが含まれてMYDATAいます。

if(GetOpenFileName(&ofn)) {
  pData[0] = new MYDATA();
  pData[0]->szFileName = ofn.lpstrFile;
}

次に、割り当てられdelete要素を呼び出しpDataてメモリを解放する必要があります。

したがって、そのすべての問題を経験する代わりに、std::vector<MYDATA>.

std::vector<MYDATA> dataVec;

// ...

if(GetOpenFileName(&ofn)) {
  MYDATA data;
  data.szFileName = ofn.lpstrFile;
  data.nSumber = something; // you probably want to init this also
  dataVec.push_back(data);
}

であり、単にそれを指してszFileNameいるのかどうかはわかりません。メモリを割り当てて、ファイル名を. その場合は の代わりに に変更してください。char *ofn.lpstrFilestructszFileNamestd::stringchar *

于 2012-12-12T18:23:32.263 に答える
0

あなたの質問は多くの詳細を省略していchar szFile[MAX_PATH]ますが、関数に対してローカルである場合はスタックにあります。szFileグローバル変数に保存して、他の場所で使用されることを期待することはできません。これは、スタック領域がスコープ外になるとすぐに再利用されるためです (}関数の次または最後)。

簡単なテストを行うofn.lpstrFile = new char[MAX_PATH]には、クラッシュが解消されるかどうかを確認してください。

于 2012-12-12T18:20:21.740 に答える
0

これは、ポインタの配列をデータに割り当てるだけです。

PMYDATA pData[MAX_THREAD];

これを有効にするには、実際にMYDATAatを割り当てる必要があります。pData[0]

于 2012-12-12T18:20:45.350 に答える