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是 achar *并且只是将其指向ofn.lpstrFile. 您可能需要分配内存并将文件名存储在struct. 如果是这种情况,请更改szFileNamestd::string而不是char *.

于 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];

您需要实际分配一个MYDATAatpData[0]才能使其有效。

于 2012-12-12T18:20:45.350 回答