lambda匿名函式使用中的坑
{
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
{
......
}
}
}
相關文章
- Python中的匿名函式-lambdaPython函式
- 初識Lambda表示式(匿名函式)函式
- Python函式與lambda 表示式(匿名函式)Python函式
- 匿名函式(lambda)詳解 C++函式C++
- lambda匿名函式sorted排序函式filter過濾函式map對映函式函式排序Filter
- 基礎拾遺---委託,匿名函式,lambda函式
- js中的匿名函式JS函式
- 使用 Lambda 取代 Android 中的匿名類Android
- 【碼上開學】Kotlin 的高階函式、匿名函式和 Lambda 表示式Kotlin函式
- Java8學習系列之匿名函式LambdaJava函式
- GO 的匿名函式使用注意Go函式
- js中匿名函式的使用簡單介紹JS函式
- C#中的委託,匿名方法和Lambda表示式C#
- 理解Python中的Lambda函式Python函式
- python基礎(補充):lambda匿名函式,用了的,都說好!Python函式
- JavaScript 中匿名函式的遞迴呼叫JavaScript函式遞迴
- 深入理解 函式、匿名函式、自執行匿名函式函式
- lambda 函式函式
- lambda函式函式
- 【UNITY3D 遊戲開發之七】C# 中的委託、事件、匿名函式、Lambda 表示式Unity3D遊戲開發C#事件函式
- 閉包函式(匿名函式)的理解函式
- Java中Lambda表示式的使用Java
- 第五篇 匿名函式、內建函式、import的使用、包的使用函式Import
- C#Light 小幅升級,支援快速繫結匿名函式、Lambda表示式C#函式
- PHP匿名函式PHP函式
- Ruby 匿名函式函式
- Golang匿名函式Golang函式
- JavaScript 匿名函式JavaScript函式
- Go 匿名函式Go函式
- JavaScript匿名函式JavaScript函式
- javascript匿名函式的使用簡單介紹JavaScript函式
- 不使用 JS 匿名函式的三個理由JS函式
- C#特性-匿名方法和Lambda表示式C#
- 什麼時候使用 Lambda 函式?函式
- 在Js中匿名函式的幾種寫法JS函式
- Mysql建表、索引、函式、查詢使用中的坑!!!MySql索引函式
- PHP 匿名函式初探PHP函式
- 匿名函式(Python)函式Python