0xC0000005: Место чтения нарушения доступа 0x00200074;происходит при возвращении из функции - PullRequest
0 голосов
/ 27 июня 2011

В настоящее время я разрабатываю программу, которая читает строки из текстового файла в 8-битном режиме ASCII, и я делаю функцию для назначения этой строки в wchar_t *

Здесь я использую макрос atlconv.h и USES_CONVERSION для преобразования строки в wstring. Итак, вот код:

void CSampleProvider::getCopy(CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR *a, const string s) {
    USES_CONVERSION;
    wstring temp(A2W (s.c_str ()));
    a->pszLabel = new WCHAR(temp.length()+1);
    if (!a->pszLabel)
        return;
    wcscpy_s(a->pszLabel, temp.size()+1, (LPWSTR)temp.c_str());
    ::MessageBox(NULL,s.c_str(),"getCopy",0);
    return;
}

Я использовал отладчик для просмотра построчно. Он работает хорошо (т.е. содержимое a-> pszLabel, как я и ожидал, такое же, как содержимое s), пока не достигнет возврата. Когда он вернулся, появилась ошибка:

First-chance exception at 0x770f3067 in CPTest.exe: 0xC0000005: Access violation reading location 0x00200074.
Unhandled exception at 0x770f3067 in CPTest.exe: 0xC0000005: Access violation reading location 0x00200074.

Кто-нибудь знает, как это исправить? Пожалуйста, скажите мне. Ваши ответы высоко ценятся :)

Спасибо, Reinardus

РЕДАКТИРОВАТЬ: О да, тип CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR является структурой, и один из ее членов является pszLabel, который является wchar_t *

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

a->pszLabel = new WCHAR(temp.length()+1); возвращает указатель на новый WCHAR, значение которого равно длине вашей строки плюс единица. Вы имели в виду a->pszLabel = new WCHAR[temp.length()+1];, который возвращает указатель на новый массив WCHAR с числом элементов, равным длине вашей строки плюс один.

0 голосов
/ 27 июня 2011

Эти вещи трудно отладить без более полной информации, но, учитывая, что вы видите ошибку при возврате из функции, я предполагаю, что переполнение буфера перезаписывает адрес возврата, заставляя код переходить к некоторому произвольному, не-rx расположение в памяти.

...