C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)

C++ std::function is null for all instances of class exept first (only Visual2019 compiler problem)

本文关键字:只有 Visual2019 问题 编译器 function std 于类 exept C++ 实例      更新时间:2023-10-16

Everething适用于在线编译器,但不适用于Visual2019

我正在创建小型库,但遇到 std::function 的问题。 我使用它是因为我需要将函数指针或 lamda 传递给类设置器之一,并在类方法中使用它。

问题是 std::function 变量对于类 exept 的所有实例首先是 NULL,但对所有实例都调用了 setter。我的类方法调用 while(true( 循环中的函数,即在其他线程中,setter 是从主函数和主线程调用的。

以下是代码的某些部分:

我调用函数的地方:

for (auto j = equalrange.first; j != equalrange.second; j++)
{
j->second->draw_updater();
if (j->second->on_update_fx != NULL)
j->second->on_update_fx();
else
std::cout << "NULLn";

二传手:

void OnUpdate(const std::function<void()> fx)
{on_update_fx = fx;};

什么会导致这个问题?等范围范围内的所有对象都不为 NULL

小例子:

#include<功能>#include<未来>类 我的类 { 公共: void SetFx(std::function <void((> func( { fx = func; } 无效 do_work(( {  ft = std::async([this] { 而(真( { if (fx != NULL( fx((; 还 { std::cout <<"NULL"; } }  });  } 私人: 标准::未来<无效>英尺; std::function <void((> fx; }; int main(( { 整数 c = 10; 我的A类; 我的B类; a.SetFx([&](( {std::cout <<"a " <<std::endl; }(; b.SetFx([&](( {std::cout <<"b " <<std::endl; }(; a.do_work((; b.do_work((; }

这不是编译器错误(并且可以由许多编译器复制......至少你的例子是不正确的。在那里,您可能会遇到未定义的行为,因为您在 std::async 调用中捕获了纯(可能消失(它。如果调试类的销毁行为,则在应用函子调用之前,至少会偶尔观察消失的对象。按值捕获所需的对象,或确保对象在所有调用期间存在。

如果您的示例完全不正确,但您确定实际的生产代码是正确的,请至少向相关部分提供所涉及的对象的生存期信息。