2011-06-27 49 views
0

我目前正在开发一个程序,从8位ASCII模式的文本文件中读取字符串,并且我做了一个函数来将该字符串分配到一个wchar_t *0xC0000005:访问冲突读取位置0x00200074;当从函数返回时发生

我在这里使用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的*

+0

你的字符串中有没有't'? “阅读地点”是否取决于“s”的内容? – Gabe

+0

是的,其实我错误地在那里建造了新的WCHAR。请看到答案,它解决了我的问题:) – user654894

回答

2

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

+0

OH MAN!当然,愚蠢的我...非常感谢,这解决了它:) – user654894

0

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

相关问题