lambda函数内部的变量显示垃圾值

时间:2014-12-06 11:11:39

标签: c++ lambda garbage-collection cocos2d-x cocos2d-x-3.0

我在Cocos2d X游戏中使用此方法。

void OpponentNode::discard(int cardNum)
{
    log("\nOpponentNode::discard <%d>\n", cardNum);
    for (int i = 0; i < vecOpponentHand.size(); i++)
    {
        if (vecOpponentHand.at(i) == cardNum)
        {
            vecOpponentHand.erase(vecOpponentHand.begin() + i);

            break;
        }
    }

    CardSprite * discardedCard;

    for (int i = 0; i < vecOpponentCards.size(); i++)
    {
        if (vecOpponentCards.at(i)->getTag() == cardNum)
        {
            discardedCard = vecOpponentCards.at(i);

            vecOpponentCards.erase(vecOpponentCards.begin() + i);

            break;
        }
    }

    log("\nOpponentNode::discard <%d>\n", cardNum);
    discardedCard->makeFaceUp();

    RotateTo * rotate = RotateTo::create(0.4 * SPEED_MULTIPLIER, 0);

    MoveTo * move = MoveTo::create(0.4 * SPEED_MULTIPLIER,
                               origin + Vec2(visibleSize.width * 0.75, visibleSize.height * 0.6));

    Spawn * spawn = Spawn::create(rotate, move, NULL);

    CallFunc * callFunc = CallFunc::create(
    [&]()
    {
        log("\nOpponentNode::discard <%d>\n", cardNum); //this one shows garbage/different value
        if (delegate)
        {
            delegate->opponentNodeDidFinishDiscard(this, cardNum);
        }

        this->removeChild(discardedCard);
    });

    discardedCard->runAction(Sequence::create(spawn, callFunc, NULL));

    log("\nOpponentNode::discard <%d>\n", cardNum);
}

奇怪的是,当我像上面那样记录整数cardNum时,我从lambda函数中的日志中得到不同的值。例如,我得到“OpponentNode :: discard&lt; 402&gt;”从前2个日志和最下面的日志中获取“OpponentNode :: discard&lt; 64&gt;”来自lambda函数内的日志。

其他要点:

  1. 最后执行lambda块。
  2. 我主要得到的值是64或垃圾值,如-15493456。
  3. 我的猜测是整数cardNum在执行之前被取消分配。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

您正在捕获对cardNum参数的引用。我认为你想要按价值捕获那个。

我不清楚delegate是什么。假设它是一个班级成员,那么我认为你只需要[this, discardedCard, cardNum]。你可以缩写为[=],尽管我认为明确的更清楚。