【问题标题】:0xC0000005: Access violation reading location 0x00200074 ; happens when returning from function0xC0000005:访问冲突读取位置0x00200074;从函数返回时发生
【发布时间】:2011-06-27 14:41:55
【问题描述】:

我目前正在开发一个程序,它以 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.

有谁知道如何解决这个问题?请告诉我。非常感谢您的回答:)

谢谢, 雷纳杜斯

编辑:哦,是的,类型 CREDENTIAL_PROVIDER_FIELD_DESCRIPTOR 是一个结构,它的成员之一是 pszLabel,它是一个 wchar_t*

【问题讨论】:

  • 您的字符串中是否有t ? “阅读位置”似乎取决于s的内容?
  • 是的,实际上我在那里构建新的 WCHAR 时犯了错误。请看答案,它解决了我的问题:)

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


【解决方案1】:

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

【讨论】:

  • 天哪!当然,愚蠢的我......非常感谢,这解决了它:)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多