gpt4 book ai didi

c++ - 通过复制捕获 Lambda 函数会导致数据损坏

转载 作者:行者123 更新时间:2023-11-28 05:36:43 24 4
gpt4 key购买 nike

std::vector<Spell*> playerSpells{ new Jump(1), new Arrow() };   

for (int i = 0; i < playerSpells.size(); i++)
{
player->addSpell(playerSpells[i]);
}

for (int i = 0; i < player->getSpells().size(); i++)
{
auto spell = player->getSpells()[i];

player->getSpells()[i]->icon->onClickEndEH.add([=]() {
auto a = player->getSpells()[i];
auto b = player->getSpells()[i]->sprite;
});
}

首先,我检查了spell 变量,它的字段已正确初始化。调用 lambda 函数时,变量 b 已损坏。如果这还不够,我可以提供代码的其他部分。

我尽量简化了;

//GAMEOBJECT.H
class GameObject
{
public:
cocos2d::Sprite* sprite = nullptr;

GameObject(const std::string fileName = "", bool clickable = false);
~GameObject();
};


//GAMEOBJECT.CPP
GameObject::GameObject(const std::string fileName, bool addClickEvent)
{
if (fileName != "")
{
this->sprite = Sprite::create(fileName);
}
else
{
this->sprite = Sprite::create();
}

if (addClickEvent)
{
this->addTouchListener();
this->clickable = true;
}
}

GameObject::~GameObject()
{
Director::getInstance()->getEventDispatcher()->removeEventListener(this->listener);
}

//SPELL.H
class Spell : public GameObject
{
public:
GameObject* icon = nullptr;

Spell(const std::string fileName = "", bool clickable = false);
~Spell();
}

//SPELL.CPP
Spell::Spell(const std::string fileName, bool clickable) : GameObject(fileName, clickable)
{
}

Spell::~Spell()
{
delete icon;
}

//ARROW.H
class Arrow : public Spell
{
public:
Arrow();
~Arrow();
};

//ARROW.CPP
Arrow::Arrow() : Spell("arrow.png")
{
this->icon = new GameObject("arrow.png", true);
}

最佳答案

通过添加 retain()release() 函数解决了这个问题。我认为 cocos2dx 检查它的池并删除 Sprite ,因为它没有被添加到范围内的场景中。

GameObject::GameObject(const std::string fileName, bool addClickEvent)
{
if (fileName != "")
{
this->sprite = Sprite::create(fileName);
}
else
{
this->sprite = Sprite::create();
}

this->sprite->retain();

if (addClickEvent)
{
this->addTouchListener();
this->clickable = true;
}
}

GameObject::~GameObject()
{
this->sprite->release();
Director::getInstance()->getEventDispatcher()->removeEventListener(this->listener);
}

关于c++ - 通过复制捕获 Lambda 函数会导致数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38121122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com