0

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

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

2 回答 2

4

你从来没有为 分配任何东西wkbs,所以你正在尝试delete[]一个未初始化的指针!

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

在这里,你分配了buf三遍!第一行绝对没有意义,因为readBytes会覆盖buf. 如果要保留分配的缓冲区,请将其存储在wkbsafter readBytes

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

接下来,您正在尝试:

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

使用您的原始代码,wkbs[j]初始化,它的值可以是任何东西。删除此指针是不安全的。

于 2012-07-14T11:24:27.493 回答
1
      in.readBytes(buf,len);
      ui->plainTextEdit->appendPlainText(QString::number(len));//length of buffer ok
      j++;
      count--;
      processGeom(buf);//data is OK

正确的。您应该调用delete[]从中获得的缓冲区readBytes。所以它当然有效。

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

对,因为这段代码没有意义。您正在对作为一个单元分配的数组的一个元素调用 delete。如果要单独释放元素,则必须单独分配它们。

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

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

这将存储使用inreadBytes分配的缓冲区,让您可以随时访问它。new[]wkbs[j]delete[]

于 2012-07-14T11:24:39.703 回答