2011-06-27 51 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內存位置。

相關問題