Вот мой код:
void StoreHelper::buyProduct(int productId, const std::function<void()>& succeded, const std::function<void()>& failed) {
//dummy code to wait 2 seconds, it'll send a request here
Director::getInstance()->getRunningScene()->getChildren().at(0)->runAction(Sequence::createWithTwoActions(DelayTime::create(2.0f), CallFunc::create([&, succeded](){
succeded(); //EXC_BAD_ACCESS
})));
}
Позвонив по номеру succeded()
в купить продукт работает основной код.Но когда я вызываю его через 2 секунды, хотя я передаю функцию в списке захвата, приложение вылетает с EXC_BAD_ACCESS:
![enter image description here](https://i.stack.imgur.com/xcsKk.png)
Однако, если я сохранюstd :: function в экземпляре класса выглядит следующим образом:
void StoreHelper::buyProduct(int productId, const std::function<void()>& succeded, const std::function<void()>& failed) {
succededCallback = succeded;
//dummy code to wait 2 seconds, it'll send a request here
Director::getInstance()->getRunningScene()->getChildren().at(0)->runAction(Sequence::createWithTwoActions(DelayTime::create(2.0f), CallFunc::create([&](){
succededCallback();
})));
}
это работает, но не всегда.Иногда все равно происходит сбой с той же ошибкой.
В чем причина этого?Это потому, что он перерабатывается из памяти?Как я могу предотвратить это?Было бы лучше, если бы мне не пришлось хранить std::function
внутри экземпляра класса, а просто передать его лямбда-функции.
Редактировать:
вот упрощенная версиякод без использования действий cocos2d-x:
void StoreHelper::buyProduct(int productId, const std::function<void()>& succeded, const std::function<void()>& failed) {
std::async(std::launch::async, [&, succeded] () {
std::this_thread::sleep_for( std::chrono::seconds{2});
succeded();
});
}
использование:
buyProduct(12345, [&]() {
//success
}, [&]() {
//failed
});
И эта упрощенная версия работает!Это может быть проблема с потоками?