为什么RakNet的SetNetworkID导致断言失败?
Why is RakNet's SetNetworkID causing an assert to fail?
所以我有一个基于RakNet的NetworkIDObjects创建对象的工厂。如果它是权威,那么它将只创建一个新对象,否则它将创建对象,然后设置Net ID:
std::shared_ptr<CNetObject> CNetObjectFactory::Create(int netObjectType, bool IsAuthority, RakNet::NetworkID networkID) const
{
auto entry = m_RegisteredObjects.find(netObjectType);
auto clone = std::shared_ptr<CNetObject>(entry->second->Clone());
clone->SetNetworkIDManager(m_NetworkIDManager.get());
if (IsAuthority)
{
clone->SetAuthority();
}
else if (networkID != 0)
{
clone->SetNetworkID(networkID);
}
return clone;
}
这对于客户端上生成的第一对NetObjects来说很好,但第三个总是在SetNetworkID:内崩溃
Assertion Failed! nio->GetNetworkID()!=rawId
使用以下调用堆栈:
MyApp.exe!RakNet::NetworkIDManager::TrackNetworkIDObject(class RakNet::NetworkIDObject *) Unknown
MyApp.exe!RakNet::NetworkIDObject::SetNetworkID(unsigned __int64) Unknown
MyApp.exe!CNetObjectFactory::Create(int netObjectType, bool IsAuthority, unsigned __int64 networkID) Line 42 C++
我在其他任何地方都找不到关于这个错误的任何信息,也无法弄清楚这个特定对象的不同之处。NetworkID似乎与以前的对象没有什么不同(只是增加了一个)。据我所知,没有任何明显的原因可以导致这次坠机。
所以我发现了问题-抛出错误是因为我试图添加一个与已经添加的对象具有相同NetworkID的对象。
它源于更上层的调用堆栈:
auto netObject = m_NetworkIDManager->GET_OBJECT_FROM_ID<CNetObject *>(networkId);
if (netObject == nullptr)
{
netObject = m_NetObjectFactory->Create(netObjectType, false, networkId).get();
}
我检查对象是否存在,如果不存在,我就继续创建它。问题是这段代码中引用的NetworkIDManager是一个完全不同的实例,这意味着检查总是失败,每次都会尝试创建一个新对象。
相关文章:
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- 在 CppUnit 中测试中止断言失败
- 使用扫描的调试断言失败
- 为什么我的Qt程序在断言失败后继续运行?
- 图片不显示,关闭时出错 --> 调试断言失败!表达式:is_block_type_valid(标头>_block_use)
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 调试断言失败 - 矢量下标超出视觉工作室的范围
- 错误:断言失败 (src.type() == CV_8UC1) 在阈值中
- Boost Beast 异步服务器失败,断言失败:(id_ != T::id) 在多个 aync 调用中
- 使用imwrite OpenCV时断言失败
- 调试断言失败的缓冲区!=nullptr
- 使用 ofstream 写入文本文件时断言失败
- 提升继续恢复断言失败
- 获取有关调试断言失败的错误:表达式:"(_Ptr_user &(_BIG_ALLOCATION_ALIGNMENT -1)) == 0" &&0
- OpenCV(3.4.1) 错误:断言失败(变暗 <= 2 && step[0] > 0) in cv::Mat::locateROI
- 在Win10上使用带有Qt5的OpenCV3.0,调试断言失败
- MFC GetDC() 断言失败 - "Not a window"
- OpenCV 错误:断言失败 - 矩阵减去