删除动态数组时Symbian发生混乱

时间:2009-08-20 14:53:38

标签: c++ symbian

我正在尝试分配一个大小为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();  
}   

感谢任何有用的提示!

3 个答案:

答案 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)

嗯,你正试图删除[]你没有分配的东西。你在删除main()中分配的数组时删除[] buff.Ptr()。