C++ Symbian在删除动态数组时陷入恐慌

C++ Symbian在删除动态数组时陷入恐慌,c++,symbian,C++,Symbian,我正在尝试分配一个大小为1000的字符数组。这个数组 传递给一个函数,在该函数中应该填充数据 已从TCP套接字接收的。问题出现了 然后,当我尝试删除[]缓冲区时:这里我得到一个用户 恐慌42。不幸的是,我真的看不出哪里出了问题 在这个简单的代码框架中 int main { unsigned char *buffer = new unsigned char[1000]; Recv(&buffer); delete[] buffer; ret

我正在尝试分配一个大小为1000的字符数组。这个数组 传递给一个函数,在该函数中应该填充数据 已从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();  
}   
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用于改进的代码。