【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.尽量不要在构造函数中调用函数或开启线程相关推荐
- C# 构造函数中调用虚函数
C# 构造函数中调用虚函数 using System; using System.Diagnostics; using System.Text; using System.Collections; u ...
- C++对象模型4——多重继承的对象内存模型、vptr与vtbl的创建与重置的时机、不要在含有虚函数的类的构造函数中调用memset
一.多重继承的对象内存模型 class Base1 { public:virtual void f() {cout << "base1::f()" << e ...
- C++在构造函数中调用构造函数
为什么80%的码农都做不了架构师?>>> C++如何在一个构造函数中调用另一个构造函数,在一篇博文中看到了这样的一道题: #include <stdlib.h> # ...
- C++学习笔记-----在一个构造函数中调用另一个构造函数
在构造函数中调用另一个构造函数如果一不注意就会有无限递归的危险,而且构造函数的参数的不同也决定了调用的不同,所以特意总结了一下哪些形式的调用时允许的: 首先假设构造函数调用时参数都是外部的变量,而不是 ...
- [react] 在构造函数中调用super(props)的目的是什么?
[react] 在构造函数中调用super(props)的目的是什么? 这是ES6的语法.class组件继承自React.Component,super(props)之后,有以下几个作用: 初始化pr ...
- linux脚本中如何调用函数,在Linux中如何在Perl脚本中调用函数(在shell脚本中定义)...
我有两个脚本,即 shell_script.sh和perl_script.pl. shell_script.sh:它有函数定义,当从Perl脚本调用时,它将以批处理模式在Linux上执行某些命令. p ...
- v-if中调用函数的问题
最近使用v-if中由于判定条件比较多,再加上一点奇思妙想,就决定在v-if中调用函数,差不多是这样. <el-checkbox v-model="checked1st" v- ...
- c语言习题 定义函数 areaT,功能是求梯形面积。要求在主函数中输入上底(用变量 a存储)、下底(用变量 b 存储)、和高(用变量 h 存储),在主函数中调用函数 areaT,输出梯形面积(用变量
定义函数 areaT,功能是求梯形面积.要求在主函数中输入上底(用变量 a存储).下底(用变量 b 存储).和高(用变量 h 存储),在主函数中调用函数 areaT,输出梯形面积(用变量 s 存储)的 ...
- Python如何在main中调用函数内的函数
Python如何在main中调用函数内的函数 一般在Python中在函数中定义的函数是不能直接调用的,但是如果要用的话怎么办呢? 一般情况下: def a():#第一层函数def b():#第二层函数 ...
最新文章
- c语言const与*位置关系,C语言程序的存储区域与const关键字的使用方法
- 推荐个所见即所得的编辑器
- python读写excel
- UI 和 UX,区别在哪里?
- J2ME下的手机游戏的优化
- Android开发常用第三方平台
- 实验6 实践课程中的程序
- 免费CDN:jsDeliver+Github使用方法
- MFC基于多文档框架(对话框内嵌office控件(word文档))
- oracle查看角色内容,oracle创建,查看用户和角色,用户角色赋权
- 自主招生计算机系面试,自主招生笔试和面试,你准备好了吗?
- 百度ERNIE新突破!登顶中文医疗信息处理权威榜单CBLUE冠军
- halcon 深度学习标注_深度学习in Halcon流程
- NAS组建日记(二):为了玩得自由,还是DIY个NAS机吧
- 诀窍|Callnovo助中国电动自行车成为大洋彼岸街头美丽风景线
- 部分女生爱搭配蕾丝的服饰
- 解决Shiro+SpringBoot异步任务长时间运行导致的UnknownSessionException错误问题
- Linux项目开发—电子相册
- 史上最全面的UE4 文件操作,打开,读、写,增、删、改、查
- matlab怎么实现循环,线性和循环卷积
- MATLAB Simulink
- MathWorks 中国