Вызов std :: function вызывает EXC_BAD_ACCESS - PullRequest
0 голосов
/ 25 октября 2018

Вот мой код:

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

Однако, если я сохраню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
});

И эта упрощенная версия работает!Это может быть проблема с потоками?

...