0xC0000005:访问冲突读取位置0x00200074;从函数返回时发生

时间:2011-06-27 06:27:55

标签: visual-c++ character-encoding access-violation

我正在开发一个程序,它以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 个答案:

答案 0 :(得分:2)

a->pszLabel = new WCHAR(temp.length()+1);返回指向新WCHAR的指针,其值为字符串的长度加1。你的意思是a->pszLabel = new WCHAR[temp.length()+1];,它返回一个指向新数组WCHAR的指针,其中元素的数量是字符串的长度加上一个。

答案 1 :(得分:0)

如果没有更完整的信息,这些东西很难调试,但鉴于你从函数返回时看到错误,我的猜测是缓冲区溢出会覆盖返回地址,导致代码跳转到某些任意,非-rx内存位置。