Есть С++ проект который я собираю clang-ом, с гитхаба состояние актуальное(графическая библиотека)(утечек памяти ни на GCC ни на clang/llvm нет)
использую «example.cpp» самого проекта не написав ни строки
суть - «write an anonymous function/lambda that passes itself as a callback»(в гугл кому надо)
псевдо-код такой:
class foo{
int id;
};
clas bar{
...
void setCallback(const function<...> &callback){...};
void callCallback(){...};
};
bar global_bar1;
bar global_bar2;
void init(){
global_bar1=new bar();
global_bar2=new bar();
foo local_foo1=new foo();
local_foo1->id=1;
global_bar1->setCallback([local_foo1]{cout<<local_foo1->id;});
foo local_foo2=new foo();
local_foo2->id=2;
global_bar2->setCallback([local_foo2]{cout<<local_foo2->id;});
}
void main(){
init();
global_bar1->callCallback();
global_bar2->callCallback();
global_bar1->callCallback();
}
вывод будет:
1
2
...тут неверный вывод
тоесть вызывая global_bar2->callCallback() второй каллбек «первый» исчезнет, крашей не будет он просто исчезнет и будет давать неверный разультат(только последний калбек работает, все предыдущие исчезают)
если:
1. переместить(копипастить) весь метод init в main (в функцию из которой вызывать каллбек) то проблема исчезнет(все калбеки работают)
2. сделать local_foo1 local_foo2 глобальныи - тоже все калбеки заработают
собирая в GCC все калбеки работают, как глобально так и локально объявленные
оригинальный код слишком объемен, сделать «рабочий минимальный код на С++» у меня не вышло(вне структуры того проекта этот баг не работает), желающим читать тыщи строк дам ссыылку на гитхаб конечноже