【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 ,然后再初始化BA的构造函数中就开启了detach线程,在线程中调用B时,B还没有被初始化,程序肯定就会崩溃了。

所以,为了排查问题更容易,尽量不要在构造函数中调用复杂的函数或开启线程。

而只在构造函数中进行简单的初始化成员变量的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值