零基础 C++ 实习 第三周 拷贝构造
背景
在验收了重构的逻辑后,主管提出了新的需求,将运行和写入解耦,利用消息队列来实现多线程加速。
初始
了解需求后,将问题从易到难逐步分解:
- 将运行和写入封装成单独函数
- 了解消息队列,建立读者写者模型,确定需要的原子操作
- 运行,调试,迭代
于是,便开始动手:封装函数,先不考率完善的线程安全,实现了粗糙的读者写者模型。
构建,报错,改,构建报错改...
在经历几个小时后,终于能够运行,但是挂了。
我将自己代入到老练的工程师中,一一排查可能的原因:
- 产生竞争(将所有竞争的地方加锁,此间还调出教科书级别的死锁bug)
- 引用出现问题,指针出现问题(逐一排查)
苦战了两天,无果。
转机
所幸我是明牌的零基础实习生,主管没有对我的工期有期待,逐步排查可能,最终在写者内部,找到了凶手:
auto deep_result = self_type;
这里self_type是一个非常简单的用来存放数据的结构体,就像算法题中的线段树节点一样。上一位开发者只是最简化的实现了析构解构。而我错误的想要实现深拷贝,在没有显示的构造拷贝函数时,c++会将内部变量都浅拷贝,正巧该结构体中有字符串数字。于是,便出现了两个变量拥有指向相同地方指针,在回收时产生了报错。从结果看,这是非常严重的报错,所幸运行时产生了显示的错误。在实现了个构造拷贝函数后,后续都十分顺利。
复盘
看到这个错误,忽然百感交集,想起了一年前大三找第一份实习时,面试官的提问:你这个怎么没有拷贝构造函数,能不能实现一下。我说不会时,他惊讶的表情仿佛再说:看来你确实不会C++。是的没有拷贝构造,简单a=b也会报错。
#正在实习的碎碎念##实习了我才知道的事#零基础 c++ 实习 文章被收录于专栏
本栏用于记录一位零基础c++实习工作过程中对c++项目的思考