C++ std::thread::detch函数之遇坑记录

简介: 调用thread::detch后,程序有可能会在当前调用函数执行完之后才去构造实参对象

问题的产生

调用thread::detch后,程序有可能会在当前调用函数执行完之后才去构造实参对象

隐患:此时函数已经执行结束,栈的空间已经被回收 ,使用已经被释放的内存去构造对象,会造成不可预估的行为,未定义行为

  1. 先自定义一个结构体,只需要编写构造函数观察
    class A {
   
   
        int YourVar;
    public:
        A(int value){
   
   
            std::cout<<"构造函数"<<std::endl;
        }
        virtual ~A(){
   
   
            std::cout<<"析构函数"<<std::endl;
        }
    };
  1. 定义线程函数
        void fun(const A obj){
   
   

        }


        int main()
         {
   
   
           int value = 1;//
           std::thread th(fun,value);
           th.detach();
           return 0;
         }

可以看出,此时对象并没有构造就已经结束了

在这里插入图片描述

解决方案

使用临时对象包装一下,此时一定可以在主线程结束之前构造完毕,确保子线程可以正常安全运行

在这里插入图片描述

目录
相关文章
|
18天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
29天前
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
43 6
|
29天前
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
21 0
C++ 多线程之线程管理函数
|
1月前
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
23 3
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
124 1
|
1月前
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
25 1
|
1月前
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
37 0
C++入门6——模板(泛型编程、函数模板、类模板)
|
21天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
21 4
|
21天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
19 4
|
21天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
17 1