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ここでは、 3回割り当てています!最初の行はreadBytes、の値を上書きするため、まったく意味がありませんbuf。割り当てられたバッファを保持する場合は、次のwkbs後に保存し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

そうです、このコードは意味がないからです。ユニットとして割り当てられた配列の1つの要素に対してdeleteを呼び出しています。要素を個別に解放する場合は、要素を個別に割り当てる必要があります。

おそらく、あなたが望んでいたのはこれでした:

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

readBytesこれにより、で割り当てるバッファが保存new[]され、いつでも割り当てるwkbs[j]ことができます。delete[]

于 2012-07-14T11:24:39.703 に答える