Проблема выделения памяти - PullRequest
0 голосов
/ 26 февраля 2011

Я пишу службу Windows, которая динамически распределяет память. Я пробовал как новый оператор c ++, так и malloc C. Они возвращают (вероятно, действительный) указатель, но когда я пытаюсь разыменовать его, программа вылетает с 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;
}

Ответы [ 2 ]

1 голос
/ 26 февраля 2011

Это довольно забавно, вы прокомментировали ответ в своем коде. recv возвращает -1, указывая, что ни одного байта не было прочитано и произошла ошибка (почему бы не проверить errno и не увидеть, в чем проблема?), а затем вы все равно вызываете regexp_cmp для неинициализированного буфера. Не удивительно, что он падает.

Во-вторых, ваш код слишком сложен. Например, размер буфера фиксирован. Зачем обновлять его? Вы можете сохранить буфер в стеке. Зачем использовать один и тот же буфер для двух разных целей? Просто выделите 2 буфера; один для отправки, а другой для recv. Тогда вам не нужно иметь дело с, возможно, проблематичной математикой указателя.

0 голосов
/ 26 февраля 2011

Я предполагаю, regexp_cmp(literalPt... обрабатывает lineralPt как строку: эта строка не завершается нулем (я не вижу никаких попыток кода завершить эту строку), поэтому функция просто переполняет этот буфер, ища '\ 0' что никогда не приходит ...

...