C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
C++ std::function is null for all instances of class exept first (only Visual2019 compiler problem)
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 调用中捕获了纯(可能消失(它。如果调试类的销毁行为,则在应用函子调用之前,至少会偶尔观察消失的对象。按值捕获所需的对象,或确保对象在所有调用期间存在。
如果您的示例完全不正确,但您确定实际的生产代码是正确的,请至少向相关部分提供所涉及的对象的生存期信息。
相关文章:
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 在不传递参数数量且只有3个点的情况下,如何使用变差函数
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 将 cin 限制为只有一个
- 只有一个内环的打印图案
- C++ std::function 对于类 exept 的所有实例都是空的(只有 Visual2019 编译器问题)
- 在运行时检查继承是否只有一种类型和 void*
- 只有级联分类器会发出未定义的引用错误
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 只有 2 和 5 作为其数字的特殊数字
- 餐饮哲学家问题 - 只有 2 个线程工作
- 如果只有 std::auto_ptr 可用,我是否仍应该使用智能指针?
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- 多 GPU 批处理 1D FFT:似乎只有一个 GPU 可以工作
- pthread只有在线程数量较少时才可以正常工作
- 什么是流的标记,为什么流中只有 1 个标记?
- 当一行中只有一个"#"而没有其他内容时,C++预处理器会做什么?
- 创建子类的多个实例,其中只有一个超类实例