2012-07-14 265 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[]它,只要你想的緩衝區。