我使用此代码从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;
}
}
答案 0 :(得分:4)
您永远不会向wkbs
分配任何内容,因此您正在尝试delete[]
未初始化的指针!
buf=wkbs[j];
buf=0;
in.readBytes(buf,len);
在这里,您要分配给buf
三次!第一行绝对没有意义,因为readBytes
将覆盖buf
中的值。如果要保留分配的缓冲区,请在wkbs
之后将其存储在readBytes
:
in.readBytes(buf, len);
wkbs[j] = buf;
接下来你正在尝试:
buf=wkbs[j];
delete[] buf;//here I get crash
使用原始代码,wkbs[j]
未初始化,其值可能是任何。删除此指针是不安全的。
答案 1 :(得分: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);
这将存储readBytes
在new[]
中wkbs[j]
分配的缓冲区,允许您随时delete[]
。