当前位置:
首页 >
【C++】45.尽量不要在构造函数中调用函数或开启线程
发布时间:2025/3/21
38
豆豆
生活随笔
收集整理的这篇文章主要介绍了
【C++】45.尽量不要在构造函数中调用函数或开启线程
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
我们有时候会有些不规范的编程习惯,如,在构造函数中开启detach分离线程,或者在构造函数中写一个初始化函数,在这个初始化函数中开启detach分离线程。这样做会有意想不到的程序崩溃问题,而且还不好排查。因为你所有的语法和逻辑都没有任何问题。
这种问题一般都是你的线程中调用了其他对象,但是那个对象却可能还没有初始化,没有初始化你就调用别人,肯定是会报错的。
我见到的是一个多继承的例子。
// Test继承A和B class Test :A, B{ // Test的构造函数初始化,a(args)和b(args)分别是对类A和类B进行初始化Test() : a(args), b(args){...} private:A a;B b; };在A的构造函数中开了detach线程,该线程中调用了B。
但是程序崩溃了,程序报错信息告诉了你,是在调用B的位置报了段错误(也可能只会在调用B的外层函数报段错误)。你自己琢磨,逻辑并没有任何问题啊,为什么报错?问题就在一个小点上,你如果没有注意到两个类构造的先后顺序,可能就会不知所措:
我们看到, Test() : a(args), b(args){}是先初始化A ,然后再初始化B。A的构造函数中就开启了detach线程,在线程中调用B时,B还没有被初始化,程序肯定就会崩溃了。
所以,为了排查问题更容易,尽量不要在构造函数中调用复杂的函数或开启线程。
而只在构造函数中进行简单的初始化成员变量的操作。
总结
以上是生活随笔为你收集整理的【C++】45.尽量不要在构造函数中调用函数或开启线程的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【opencv】14.cv::cvtCo
- 下一篇: 【C++】46.宏定义##连接符和符#的