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;
         }

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

在这里插入图片描述

解决方案

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

在这里插入图片描述

目录
相关文章
|
2天前
|
编译器 C++
【C++进阶】引用 & 函数提高
【C++进阶】引用 & 函数提高
|
7天前
|
C++
C++从入门到精通:2.1.2函数和类——深入学习面向对象的编程基础
C++从入门到精通:2.1.2函数和类——深入学习面向对象的编程基础
|
7天前
|
存储 C++
C++从入门到精通:2.1.1函数和类
C++从入门到精通:2.1.1函数和类
|
7天前
|
C++
【C++】std::string 转换成非const类型 char* 的三种方法记录
【C++】std::string 转换成非const类型 char* 的三种方法记录
5 0
|
14天前
|
机器学习/深度学习 定位技术 C++
c++中常用库函数
c++中常用库函数
38 0
|
16天前
|
算法 搜索推荐 C++
浅谈sort函数底层(一道c++面试的天坑题)
浅谈sort函数底层(一道c++面试的天坑题)
|
18天前
|
编译器 C++
C++ 解引用与函数基础:内存地址、调用方法及声明
C++ 中的解引用允许通过指针访问变量值。使用 `*` 运算符可解引用指针并修改原始变量。注意确保指针有效且不为空,以防止程序崩溃。函数是封装代码的单元,用于执行特定任务。理解函数的声明、定义、参数和返回值是关键。函数重载允许同一名称但不同参数列表的函数存在。关注公众号 `Let us Coding` 获取更多内容。
136 1
|
8天前
|
C++
c++的学习之路:7、类和对象(3)
c++的学习之路:7、类和对象(3)
21 0
|
1天前
|
存储 Java C++
【C++类和对象】探索static成员、友元以及内部类
【C++类和对象】探索static成员、友元以及内部类
|
1天前
|
安全 程序员 编译器
【C++类和对象】初始化列表与隐式类型转换
【C++类和对象】初始化列表与隐式类型转换