内存分配问题

时间:2011-02-26 09:52:54

标签: c++ windows-services malloc segmentation-fault

我正在编写一个动态分配内存的Windows服务。我尝试了c ++的new运算符和C的malloc。它们返回(可能是有效的)指针,但是当我尝试取消引用它时程序崩溃,Windows说:

  

“0x77c478ac”的指示   在“0x00cb9001”引用内存。该   记忆无法“读”。

BTW我猜指针有效,因为引用的内存不是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 个答案:

答案 0 :(得分:1)

这很有趣,你的代码中有答案。 recv返回-1,表示没有读取字节并且有错误(为什么不检查errno并查看问题是什么?)然后在未初始化的缓冲区上调用regexp_cmp。难怪它崩溃了。

作为第二点,你的代码过于复杂。例如,缓冲区大小是固定的。为什么要打扰新手呢?您可以将缓冲区保留在堆栈中。为什么为两个不同的目的共享相同的缓冲区?只需分配2个缓冲区;一个用于发送,另一个用于recv。那么你不需要处理可能有问题的指针数学。

答案 1 :(得分:0)

我假设regexp_cmp(literalPt...将lineralPt视为一个字符串:该字符串不是以null结尾(我看不到任何代码努力终止该字符串)所以该函数只是溢出该缓冲区寻找'\ 0'永远不会......