lambda 函数中的变量显示垃圾值

Variable inside lambda function is showing garbage value

本文关键字:显示 变量 函数 lambda      更新时间:2023-10-16

我在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);
}

奇怪的是,当我像上面一样记录整数卡数字时,我得到的值与 lambda 函数内的日志不同。例如,我从顶部 2 个日志和最底部的日志中得到"RivalNode::d iscard <402>",但从 lambda 函数内的日志中得到"RivalNode::d iscard <64>"。

其他要点:

  1. lambda 块最后执行。
  2. 我主要获得像 64 这样的值或像 -15493456 这样的垃圾值。

我的猜测是整数卡在执行之前被释放。谁能指出我正确的方向?

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

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