2012-07-14 270 views
0

使用此代码从QTcpSocket获取数据。我在缓冲区中读取数据,然后立即释放数据。但是如果我稍后释放它,应用程序就会崩溃。 QtDocs说,我要清理内存删除[]使用方法的ReadBytes数据缓冲区

void Widget::slotReadClient() 
{ 
    QTcpSocket* pClientSocket = (QTcpSocket*)sender(); 
    QDataStream in(pClientSocket); 
    in.setVersion(QDataStream::Qt_4_7); 
    for (;;) 
    { 
     if (!m_nNextBlockSize) 
     { 
      if (pClientSocket->bytesAvailable() < sizeof(quint16)) 
      { 
       break; 
      } 
      in >> m_nNextBlockSize; 
     } 
     if (pClientSocket->bytesAvailable() < m_nNextBlockSize) 
     { 
      break; 
     } 
     QString attribute; 
    quint16 count=0; 
     in>>count;//count of massives 
    quint16 els=count; 
    uint len=0; 
    char** wkbs; 
    if(count) 
      wkbs=new char*[els]; 
    int j=0; 
    char* buf=0; 

     while(count) 
     { 
      in>>attribute;//description its ok 
      buf=wkbs[j]; 
      buf=0; 
      in.readBytes(buf,len); 
      ui->plainTextEdit->appendPlainText(QString::number(len));//length of buffer ok 
      j++; 
      count--; 
      processGeom(buf);//data is OK 
      //delete [] buf; if I use this it works 
     } 
     ui->plainTextEdit->appendPlainText(QString::number(els)); 
     j=0; 
     while(els) 
     { 
      buf=wkbs[j]; 
      delete[] buf;//here I get crash 
      els--; 
      j++; 
     } 
     delete[] wkbs; 
     m_nNextBlockSize = 0; 
    } 
} 

回答

4

你永远分配什么wkbs后,所以您要delete[]未初始化指针!

buf=wkbs[j]; 
buf=0; 
in.readBytes(buf,len); 

在这里,您分配给buf三次!第一行绝对没有意义,因为readBytes将覆盖buf中的值。如果你想保留所分配的缓冲区,将其存储在wkbsreadBytes:您正在尝试

in.readBytes(buf, len); 
wkbs[j] = buf; 

下一页:

buf=wkbs[j]; 
delete[] buf;//here I get crash 

随着你的原代码,wkbs[j]初始化,其值可以是任何东西。删除这个指针是不安全的。

+0

非常感谢你的解释 – bossman 2012-07-14 11:29:54

1
 in.readBytes(buf,len); 
     ui->plainTextEdit->appendPlainText(QString::number(len));//length of buffer ok 
     j++; 
     count--; 
     processGeom(buf);//data is OK 

对。您应该从readBytes获得的缓冲区上拨打delete[]。所以它当然是有效的。

 buf=wkbs[j]; 
     delete[] buf;//here I get crash 

对,因为这段代码没有意义。您正在调用删除数组中作为单位分配的一个元素。如果你想单独释放元素,你必须分别分配它们。

想必,你想要的是这样的:

 in.readBytes(wkbs[j], len); 

这将存储在readByteswkbs[j]分配new[],让您delete[]它,只要你想的缓冲区。