我正在尝试分配一个大小为1000的char数组。这个数组 被传递给一个应该用数据填充的函数 从TCP Socket收到的。出现问题 然后当我尝试删除[]缓冲区时:我在这里得到一个用户 恐慌42.不幸的是,我真的没看到出了什么问题 在这个简单的代码中... ...
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();
}
感谢任何有用的提示!
答案 0 :(得分:5)
Konrad说的是真的,但我不认为他知道Symbian。如果你确实需要一个函数来将字节读入char缓冲区,那么更好的解决方法是:
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&amp;。因此可以使套接字将其数据直接写入缓冲区,而不是写入堆栈中的缓冲区,然后按照Konrad的代码进行复制。
您可能还需要检查状态以检测错误,并报告成功/失败以及写回呼叫者的长度。
答案 1 :(得分:2)
您的数组分配没有效果,因为在函数内部,您为数组指定了一个新指针:
*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);
}
请注意,buffer
指针现在直接传递给函数Recv
,因为我们不直接操作指针,所以不需要进一步间接。
答案 2 :(得分:0)