C++ Symbian在删除动态数组时陷入恐慌
我正在尝试分配一个大小为1000的字符数组。这个数组 传递给一个函数,在该函数中应该填充数据 已从TCP套接字接收的。问题出现了 然后,当我尝试删除[]缓冲区时:这里我得到一个用户 恐慌42。不幸的是,我真的看不出哪里出了问题 在这个简单的代码框架中C++ Symbian在删除动态数组时陷入恐慌,c++,symbian,C++,Symbian,我正在尝试分配一个大小为1000的字符数组。这个数组 传递给一个函数,在该函数中应该填充数据 已从TCP套接字接收的。问题出现了 然后,当我尝试删除[]缓冲区时:这里我得到一个用户 恐慌42。不幸的是,我真的看不出哪里出了问题 在这个简单的代码框架中 int main { unsigned char *buffer = new unsigned char[1000]; Recv(&buffer); delete[] buffer; ret
int main
{
unsigned char *buffer = new unsigned char[1000];
Recv(&buffer);
delete[] buffer;
return (0);
}
void Recv(unsigned char **buffer)
{
TRequestStatus iStatus;
TSockXfrLength len;
TBuf8<1000> buff;
iSocket.RecvOneOrMore( buff, 0, iStatus, len );
User::WaitForRequest(iStatus);
*buffer = ( unsigned char* )buff.Ptr();
}
int main
{
无符号字符*缓冲区=新的无符号字符[1000];
Recv(和缓冲区);
删除[]缓冲区;
返回(0);
}
void Recv(无符号字符**缓冲区)
{
树突状态;
t锁模长度透镜;
TBuf8浅黄色;
iSocket.RecvOneOrMore(增益,0,iStatus,len);
用户::WaitForRequest(iStatus);
*buffer=(unsigned char*)buff.Ptr();
}
谢谢你提供的有用提示 您的数组分配无效,因为在函数中,您为数组分配了一个新指针:
*buffer = ( unsigned char* )buff.Ptr();
现在,缓冲区指向另一个内存位置,可能是使用delete
无法释放的位置(例如,堆栈上的一个位置,或使用new
以外的其他内容分配的位置)
要解决此问题,最好将数据复制到阵列:
void Recv(unsigned char *buffer)
{
TRequestStatus iStatus;
TSockXfrLength len;
TBuf8<1000> buff;
iSocket.RecvOneOrMore( buff, 0, iStatus, len );
User::WaitForRequest(iStatus);
unsigned char* const tmpbuf = static_cast<char*>(buff.Ptr());
std::copy(tmpbuf, tmpbuf + len, buffer);
}
void Recv(无符号字符*缓冲区)
{
树突状态;
t锁模长度透镜;
TBuf8浅黄色;
iSocket.RecvOneOrMore(增益,0,iStatus,len);
用户::WaitForRequest(iStatus);
unsigned char*const tmpbuf=static_cast(buff.Ptr());
std::copy(tmpbuf,tmpbuf+len,buffer);
}
请注意,
buffer
指针现在直接传递给函数Recv
,因为我们不直接操作指针,所以不需要进一步的间接操作。嗯,您正在尝试删除[]一些您没有分配的内容。你在泄露main()中分配的数组时删除了buff.Ptr()。Konrad说的是真的,但我认为他不了解Symbian。如果您确实需要一个函数将字节读入字符缓冲区,那么更好的修复方法是:
void Recv(unsigned char *aBuffer, int aSize)
{
TRequestStatus iStatus;
TSockXfrLength len;
TPtr8 buff(aBuffer, aSize);
iSocket.RecvOneOrMore( buff, 0, iStatus, len );
User::WaitForRequest(iStatus);
}
TBuf8是一个描述符,其中包含用于保存数据的数组。TPtr8是一个描述符,它引用您指定的外部缓冲区。两者都可以传递到RecvOneOrMore,因为它们都继承自参数类型TDes8&。因此,可以让套接字直接将其数据写入缓冲区,而不是像Konrad的代码那样写入堆栈上的缓冲区,然后进行复制
您可能还需要检查状态以检测错误,并向调用者报告成功/失败和写回的长度。您的“推测”是正确的,它在堆栈上。TBuf8包含一个N字节数组。fwiw,buff.Ptr()的类型是TUint8*,TUint8是无符号字符的typedef。这正是我要找的。非常感谢一个接一个的和其他人的有用的评论!“……但我认为他不认识塞班”—完全正确+1用于改进的代码。