{
ValueMap opData;
opData["op"] = "selectrole";
opData["roleuid"] = roleUid;
Remote::getInstance()->execForeGroundOp(opData, [&](int result, ValueMap& respVm)
{
if (result == 0)
{
m_role.m_uid = respVm["roleuid"].asString();
if (m_role.readLocalRoleData(roleUid))
{
......
}
else
{
......
}
}
}
其中CallbackFunc的定义为:
typedef std::function<void(int, ValueMap&)> CallbackFunc;
这里埋着一个大地雷,看到了吗,我足足调了一下午,log打了几十行,然后编译再编译。
roleUid是从外部传来的 引用,注意是引用,当execForeGroundOp被调用时,roleUid已经被外部修改了,或者它仅仅是存在栈里,走到execForeGroundOp函数时,那roleUid变量早就无效了。
正确的写法,应该使用roleUid的复制,而不是引用,改法如下:
void RoleManager::selectRole(const std::string &roleUid, const CallbackFunc &callback)
{
ValueMap opData;
opData["op"] = "selectrole";
opData["roleuid"] = roleUid;
Remote::getInstance()->execForeGroundOp(opData, [this,roleUid](int result, ValueMap& respVm)
{
if (result == 0)
{
m_role.m_uid = respVm["roleuid"].asString();
if (m_role.readLocalRoleData(roleUid))
{
......
}
else
{
......
}
}
}