我正在开发一个程序,它以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 *
答案 0 :(得分:2)
a->pszLabel = new WCHAR(temp.length()+1);
返回指向新WCHAR
的指针,其值为字符串的长度加1。你的意思是a->pszLabel = new WCHAR[temp.length()+1];
,它返回一个指向新数组WCHAR
的指针,其中元素的数量是字符串的长度加上一个。
答案 1 :(得分:0)
如果没有更完整的信息,这些东西很难调试,但鉴于你从函数返回时看到错误,我的猜测是缓冲区溢出会覆盖返回地址,导致代码跳转到某些任意,非-rx内存位置。