我正在尝试分配一个大小为1000的char数组.这个数组被传递给一个函数,在该函数中应该填充从TCP套接字接收的数据.当我尝试删除[]缓冲区时会出现问题:在这里我得到一个用户恐慌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();
}
Run Code Online (Sandbox Code Playgroud)
感谢任何有用的提示!
康拉德说的是真的,但我认为他不懂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);
}
Run Code Online (Sandbox Code Playgroud)
TBuf8是一个描述符,它包含一个用于保存数据的数组.TPtr8是一个描述符,它指向您指定的外部缓冲区.两者都可以传递给RecvOneOrMore,因为它们都继承自参数类型TDes8&.因此,可以使套接字将其数据直接写入缓冲区,而不是写入堆栈中的缓冲区,然后按照Konrad的代码进行复制.
您可能还需要检查状态以检测错误,并报告成功/失败以及写回调用者的长度.