调用变量时出现内存错误

时间:2018-11-16 09:58:05

标签: c++ winapi

当我将指针传递给函数时,我得到的错误总是与内存相关的(此当前设置引发违反内存的异常)。

我尝试了各种实现方式来解决该问题,但没有任何效果。
这是代码:
在课堂上:

class OpenFileDialog {
public:
  OpenFileDialog();
  ~OpenFileDialog();
  static bool BrowseFiles(wstring* fileName) {
    OPENFILENAMEW ofn;
    //ZeroMemory(fileName,sizeof(fileName));
    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = NULL;
    ofn.lpstrFilter = _T("All\0*.*\0Text\0*.txt\0");
    ofn.lpstrFile = LPWSTR((*fileName).c_str());
    ofn.nMaxFile = MAX_PATH;
    ofn.lpstrTitle = _T("Select a File!");
    ofn.Flags = OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST;
    if (GetOpenFileNameW(&ofn)) {
        return true;
    } else {
        return false;
    }
}};

方法调用:

try {
    wstring fileName;
    if (OpenFileDialog::BrowseFiles(&fileName)) {
        A(fileName); // erros here
    } else {
        A(_T("Failed"));
    }
} catch (bad_alloc) {
    A(L"Bad allocation");
}

1 个答案:

答案 0 :(得分:3)

强制转换LPWSTR((*fileName).c_str())暗示您做错了事。

字符串fileName empty ,它没有分配任何内存。调用c_str()将返回一个指针,该指针指向零字符的 常数 字符串。

所以有两个错误:您尝试将数据写入不存在的内存;即使这样做,它也将是恒定的,而且无论如何都无法修改。两者都导致undefined behavior

您需要创建一个临时字符数组,其大小足以容纳可能的最长路径,然后在fileName成功之后将GetOpenFileNameW初始化为该字符串。