Vector 非托管代码中擦除时的STL向量异常

Vector 非托管代码中擦除时的STL向量异常,vector,c++-cli,unmanaged,Vector,C++ Cli,Unmanaged,这是一个静态函数,它是一个非托管函数,我试图从托管CLR项目调用它。但每次我添加擦除时都会发生异常。两个类都在同一个项目中 我总是在擦除上遇到一个异常 #pragma managed(push, off) void MessageContainer::ParseByteStream(UINT8 *buf, int length) { s_RxBufVector.insert(s_RxBufVector.end(), buf, buf + length);

这是一个静态函数,它是一个非托管函数,我试图从托管CLR项目调用它。但每次我添加擦除时都会发生异常。两个类都在同一个项目中 我总是在擦除上遇到一个异常

    #pragma managed(push, off)
    void MessageContainer::ParseByteStream(UINT8 *buf, int length)
    {
        s_RxBufVector.insert(s_RxBufVector.end(), buf, buf + length);
        if (s_RxBufVector.size() >= sizeof(Msg_Struct) * 2)
        {
            int BytesConsumed = 0;
            s_RxBufIterator = s_RxBufVector.begin();
            while (BytesConsumed < (int)s_RxBufVector.size() - sizeof(Msg_Struct))
            {
                if (ntohl(*((UINT32 *)&s_RxBufVector[BytesConsumed + __PREAMBLE_OFFSET])) == PreambleVal)
                {
                    switch (ntohl(*((UINT32 *)&s_RxBufVector[BytesConsumed + __COMMAND_ID_OFFSET])))
                    {
                    case eCommandIdRxMsg:
                        if (MsgRx != nullptr)
                            (*MsgRx)(ntohl(*((UINT32*)&s_RxBufVector[BytesConsumed + __ID_OFFSET])), ntohs(*((UINT16*)(&s_RxBufVector[BytesConsumed + __CHANNEL_OFFSET]))),
                                ntohs(*((UINT16*)&s_RxBufVector[BytesConsumed + __LENGTH_OFFSET])), &s_RxBufVector[BytesConsumed + __BUFFER_OFFSET]);
                        break;
                    case eCommandIdCmdAck:
                        if (CmdAck != nullptr)
                            //(*CmdAck())
                            break;
                    case eCommandIdSendAck:
                        if (TxConf != nullptr)
                            //(*TxConf())
                            break;
                    default:
                        break;
                    }
                    BytesConsumed += sizeof(Msg_Struct);
                }
                else
                {
                    BytesConsumed++;
                }
            }
            s_RxBufVector.erase(s_RxBufIterator, s_RxBufIterator + BytesConsumed);
        }
    }

private:
        static std::vector<UINT8, std::allocator<UINT8>> s_RxBufVector;
        static std::vector<UINT8>::iterator s_RxBufIterator;
Init()
{
        s_RxBufVector.reserve(4096);
}
休息时间到此为止 _采用权利。我的代理->我的公司

更糟糕的是,我试图在开始时删除24个字节,而大小已经是48

编辑:

好的,我发现注释掉托管代码回调的代码可以解决异常,但对我也没有帮助

(*MsgRx)(ntohl(*((UINT32*)&s_RxBufVector[BytesConsumed + __ID_OFFSET])), ntohs(* (UINT16*)(&s_RxBufVector[BytesConsumed + __CHANNEL_OFFSET]))), ntohs(*((UINT16*)&s_RxBufVector[BytesConsumed + __LENGTH_OFFSET])), &s_RxBufVector[BytesConsumed + __BUFFER_OFFSET]);
回调在这里声明

delegate void MessageReceivedCallbackDelegate(UInt32 Id, UInt16 Channel, UInt16 len, Byte *data);

MessageContainer::SetMessageRxCB((void*)Marshal::GetFunctionPointerForDelegate(gcnew MessageReceivedCallbackDelegate(MessageReceived)));

unmanaged       
void MessageContainer::SetMessageRxCB(void *fn)
    {
        MsgRx = (RxCbFn)fn;
    }
托管代码似乎给向量带来了一些问题。我尝试调用托管代码的方式可能有问题,我需要一些提示:

已解决:


好吧,我忘了装饰代表了

[UnmanagedFunctionPointerAttribute(CallingConvention::Cdecl)]
delegate void MessageReceivedCallbackDelegate(UInt32 Id, UInt16 Channel, UInt16 Dlc, Byte *data)

1 erase使向量中的迭代器无效,您正在使用可能无效的迭代器值调用erase。2为什么不输出用于向量的索引值?或者使用vector::at函数来确定是否越界。好的,我忘了修饰委托[UnmanagedFunctionPointerAttributeCallingConvention::Cdecl]委托无效消息ReceivedCallbackDelegateUINT32 Id,UInt16通道,UInt16 Dlc,字节*数据
[UnmanagedFunctionPointerAttribute(CallingConvention::Cdecl)]
delegate void MessageReceivedCallbackDelegate(UInt32 Id, UInt16 Channel, UInt16 Dlc, Byte *data)