Vector 非托管代码中擦除时的STL向量异常
这是一个静态函数,它是一个非托管函数,我试图从托管CLR项目调用它。但每次我添加擦除时都会发生异常。两个类都在同一个项目中 我总是在擦除上遇到一个异常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);
#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)