2011-02-26 221 views
0

我正在編寫一個動態分配內存的Windows服務。我嘗試了C++的新操作符和C的malloc。他們返回(可能是有效的)指針,但是當我嘗試取消對它的引用程序崩潰與Windows話說:內存分配問題

在「0x77c478ac」在「0x00cb9001」 指令引用內存。 內存不能被「讀取」。

順便說一句我猜指針是有效的,因爲引用的內存不是NULL(0x00cb9001)。

編輯:這裏是代碼

/* This is a thread procedure that is 
    called when connection arrives 
    and its purpose is to serve as a 
    regular expression server. 
*/ 
void threadProc(LPVOID *ptr){ 
    SOCKET accSock = (SOCKET) *ptr; 
    void * foundPtr; 
    int recvdBytes; 
    char * literalPtr; 
    u_long iMode = 0; 

    literalPtr = new char [4096]; //this may cause the problem 
    //We allocate 4kb but in fact the first 2 kbs will be for 
    //for the literal string, the next 2 kb are for the result 
    //that must be returned 
    ioctlsocket(accSock, FIONBIO, &iMode); //the "parent" socket was nonblocking 

     if(literalPtr){ 

    recvdBytes = recv(accSock, (literalPtr+1), 2048, 0); //BTW, recv returns -1 

    foundPtr = regexp_cmp(literalPtr, fBuffer, 0); //program crashes when calling this function 

    if(!foundPtr){ 
     *(literalPtr+2048) = (int) 0; 
     send(accSock, (char *) (literalPtr+2048), 4, 0); //sending 4 NULLs 
    } 
    else { 
     send(accSock, (char *) (literalPtr+2048), 2048, 0); 
} 
    shutdown (accSock, 0); 
    delete[] literalPtr; 
    return; 
} 
+3

你需要顯示所涉及的代碼,你使用的指針*絕對*無效,如果它是你不會像你顯示的那樣在手上崩潰。 – 2011-02-26 09:54:44

+0

您是否將指針傳遞給其他進程? – 2011-02-26 10:01:09

+0

不會。分配問題發生在線程中,並且不會將指針傳遞給其他線程或進程。 – 2011-02-26 10:33:57

回答

1

這很有趣,你有答案在你的代碼中評論。 recv返回-1,表示沒有讀取字節並且出現錯誤(爲什麼不檢查errno並查看問題是什麼?),然後在未初始化的緩衝區上調用regexp_cmp。難怪它崩潰。

第二點,你的代碼過於複雜。例如,緩衝區大小是固定的。爲什麼要麻煩它呢?您可以將緩衝區保留在堆棧上。爲什麼爲了兩個不同的目的共享相同的緩衝區只需分配2個緩衝區;一個用於發送,另一個用於recv。那麼你不需要處理可能有問題的指針數學。

+0

我覺得自己像個傻瓜。我不認爲充滿零的記憶可能會引發這樣的例外...... – 2011-02-26 19:10:11

0

我假設regexp_cmp(literalPt...對待lineralPt作爲一個字符串:該字符串不爲空終止(我看不到任何代碼努力終止字符串)所以函數簡單地溢出緩衝區尋找'\ 0'永遠不會來...

+0

'regexp_cmp'真正將literalPtr當作字符串對待,但實際上'recv'不能按預期工作 - 它返回-1,所以我認爲問題出在新運算符上。 – 2011-02-26 11:23:32

+0

新的爲了我是好的。 (memset) – 2011-02-26 11:29:19

+0

你不必使用修正器,你可以要求new通過new char初始化緩衝區[4096](); – 2011-02-26 11:56:03