Ошибки памяти при вызове переменной - PullRequest
0 голосов
/ 16 ноября 2018

Я получаю различные ошибки, которые всегда связаны с памятью (этот текущий набор вызывает исключение нарушения памяти), когда я передаю указатель на функцию.

Я пробовал различные реализации, чтобы решить проблему, но ничего не помогло.
Вот код:
В классе:

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 голосов
/ 16 ноября 2018

Приведение LPWSTR((*fileName).c_str()) должно быть подсказкой, что вы делаете что-то не так.

Строка fileName равна пусто , для нее не выделено никакой памяти.Вызов c_str() вернет указатель на константу строку нулевых символов.

Итак, есть две ошибки: Вы пытаетесь записать данные в память, которая не 'т существует;И даже если бы это было так, оно все равно было бы постоянным и не изменяемым.Оба приводят к неопределенное поведение .

Вам необходимо создать временный массив символов, достаточно большой, чтобы вместить максимально длинный путь, а затем инициализировать fileName дляэта строка после GetOpenFileNameW успешна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...