自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(89)
  • 收藏
  • 关注

原创 gcc 与 g++ 的区别:本身不是编译器而是编译器驱动

`gcc` 和 `g++` 的差异,本质是 **默认行为的定位不同**: - `gcc`:通用编译器驱动,默认面向 C 语言,链接行为精简,需手动处理非 C 标准库依赖; - `g++`:C++ 专用驱动,默认按 C++ 规则处理,自动链接 C++ 标准库和数学库,更贴合 C++ 开发需求。

2025-08-20 21:08:45 864

原创 为什么不应该包含 <bits/stdc++.h>?

bits\/stdc++.h 就像一把 “瑞士军刀”—— 看似方便,却不适合所有场景。在工程开发中,它带来的兼容性风险、编译效率损失和代码维护成本,远大于 “少写几行 include” 的便利。

2025-08-14 20:50:44 511

原创 单例的 “隐形枷锁”:循环引用如何悄悄拖垮你的程序

单例模式循环引用问题分析 摘要: 单例模式在C++开发中被广泛用于管理全局资源,如日志模块和配置管理。然而,当多个单例相互引用时(如Logger需要Config,Config又需要Logger),就会形成循环引用,导致资源无法释放或程序崩溃。文章通过具体案例展示了单例循环引用的典型场景,并指出在构造阶段可通过C++11的static变量初始化保证唯一性,但析构阶段的循环引用会引发coredump。这种问题在系统关闭时尤为危险,可能导致内存泄漏或状态不一致。

2025-08-12 22:09:13 937

原创 lsof 救场记:一条命令揪出日志模块的 “隐形 bug”

摘要: 同事反馈按文档配置日志路径后无法找到日志文件,经排查发现配置中路径分隔符“/”误写为“:”,导致日志被错误创建为/data/service/logs:payment.log而非预期路径。通过lsof命令追踪进程打开的文件,迅速定位到“隐形”日志文件,解决了路径配置错误的问题。文章还介绍了lsof的其他实用场景(如查找被删除但仍占用的文件、查看端口占用等),强调其在Linux开发中排查文件相关问题的价值。案例揭示了工具在绕过表面现象、直击问题本质中的作用。 (字数:149)

2025-08-09 16:57:33 772

原创 C++灵魂拷问:结构体成员变量会有默认值吗

C++结构体成员变量初始化问题解析:基本数据类型(int、bool等)不会自动初始化,保留内存垃圾值;类类型成员(如string)会调用默认构造函数。未初始化结构体可能导致程序崩溃且难以定位。正确初始化方式包括:初始化列表、指定成员初始化、定义默认构造函数、值初始化。建议开启编译器警告(-Werror=uninitialized)并使用内存检测工具(valgrind/asan)。关键原则:内置类型必须显式初始化,养成"定义即初始化"的习惯。

2025-08-05 02:15:02 459

原创 新手 BUG:初始化列表真的能控制成员变量的初始化顺序吗?

【摘要】文章揭示了一个常见的C++初始化陷阱:类成员变量的初始化顺序仅由声明顺序决定,与构造函数初始化列表的书写顺序无关。通过案例演示,当Config类中min_val先于max_val声明时,即使初始化列表将max_val写在前面,min_val仍然会使用未初始化的max_val进行计算。解决方案包括调整声明顺序匹配依赖关系,或使用-Wreorder编译选项检测问题。文章强调这是C++标准行为,建议开发者理解内存模型本质,必要时可用构造函数体内赋值替代初始化列表。

2025-08-04 00:47:11 263

原创 新手BUG:函数中 static 变量的赋值语句只会执行一次

C++中static变量在函数内的初始化机制存在关键特性:仅首次调用时执行初始化,后续调用会复用第一次的值。这导致新手常误以为static bool value = funcB()会在每次调用时执行funcB(),实际上funcB()只执行一次。正确用法是:需要跨调用保持状态时用static(如缓存、计数器),需要每次重新计算时用普通局部变量。典型错误场景包括错误获取实时数据或动态配置,正确做法是移除static关键字。static变量适用于单例模式、缓存计算结果等只需初始化一次的场景。

2025-08-04 00:45:33 352

原创 新手BUG:在声明了返回值的函数中不写返回值

通过添加编译选项-Werror=return-type,在编译时期对声明了返回值但是没有写返回语句的函数进行报错拦截,防止运行时期出现各种奇怪问题。

2024-11-02 18:44:51 1442

原创 统计进程的CPU和内存占用(最大,均值,90分位)

本文先通过top采集所有进程的CPU和内存情况并保存到文件,然后提取指定进程的数据,最后通过 python 对采集的数据进行可视化。关闭CPU的统计图之后会显示第二列内存占用的数据,可拖拽或者放大查看细节。脚本运行后,每采集一次会在终端打印时间信息,按ctrl+c可停止采集。绘制折线图,并将最大值,平均值,90分位值并显示到图片中。首先是显示第一列CPU占用的数据,可拖拽或者放大查看细节。脚本读取CSV文件,并先后显示每一列的数据统计图。

2024-09-08 13:35:48 914

原创 Linux最直观的性能分析(热点分析)-编译perf并生成火焰图

本文先介绍了linux下perf工具的使用场景,然后对命令行安装和源码编译安装两种方式做了说明,接下来通过最简单的perf top命令给出perf的直观印象,最后通过perf record生成火焰图的方式说明如何发现进程中的函数热点。

2024-07-20 16:34:18 2034 1

原创 一次进程虚拟内存占用超过200G问题分析

一次性分配大块内存的,可通过gdb单步骤执行快速确认具体位置持续小内存分配逐渐增长的,借助工具采集数据分析。

2024-06-29 12:18:48 1068

原创 别再滥用std::async了,strace命令暴露了一个乱开线程问题

用strace查看进程的系统调用后,发现一个std::async滥用问题。

2024-06-22 17:43:18 339

原创 一个cmake版的C++项目代码模板,包含流水线、git以及代码格式化配置等支持CICD发布流程

本文给出快速构建C++项目的代码仓库模板 ,简单却完整编译脚本打包上传脚本-依赖拉取代码格式化配置git配置流水线pipeline配置使用这个模板你只需要:将源文件放到模块目录下,并添加到cmake中即可。

2024-06-22 16:44:45 634

原创 使用GNU Gcov & Lcov生成C++单元测试代码覆盖率报告

如何确定哪些代码被测试覆盖,哪些未被测试,并评估整体的代码覆盖率?本文介绍了如何使用 Gcov 和 LCOV 工具统计 C/C++ 项目的代码覆盖率。

2024-06-15 15:10:48 919 1

原创 google全家桶:glog/gflags/gtest编译安装和使用

gflags:Google开源命令行参数解析工具,从环境变量或配置文件中读配置glog:Google开源日志库,用来打印日志,支持多种级别日志打印gtest:Google开源的C++测试框架,可在源代码中定义测试用例Google的开源代码,有保证多人使用和验证过经典的日志库。

2024-06-05 09:58:40 2630

原创 小公司的软件开发IT工具箱

小公司软件开发人员,你该知道的那些IT基础设施。从几十人发展到几百人,这是我们的实践。

2024-06-02 16:54:29 830

原创 cmake使用交叉编译工具链并验证

cmake配置编译并使用VERBOSE验证

2024-05-26 11:58:44 1068

原创 vscode+docker搭建迷你开发环境。制作docker镜像,并通过vscode连接后进行开发

vscode+docker搭建最小化迷你开发环境。制作docker镜像,并作为开发环境通过vscode连接。

2024-05-21 09:57:43 4974

原创 docker中安装jenkins,并在node和cloud上跑通基于源码控制SCM的pipeline

从安装jenkins到创建jenkins的node和cloud,最后再将scm和FreeStyle两种流水线跑通。

2024-05-19 18:51:10 2005

原创 git分支策略(github-flow VS git flow,如何选择)

github-flow VS git flow,不同项目周期,不同团队规模,如何选择git代码分支管理策略

2024-05-18 16:08:20 1586

原创 CICD:搭建gitlab-runner服务实现自动化编译打包上传

通过ruuner实现,在gitlab上的仓库打了tag后自动触发编译、打包、上传等自动化发版流程。gitlab-runner依赖项很少可以直接通过deb包的方式部署到物理机。

2024-05-17 09:58:31 953

原创 花了2小时,我在公司内网搭建了gitlab服务

1小时,在ubuntu的docker中搭建gitlab服务器,环境隔离,方便迁移

2024-05-16 10:59:17 4139 1

原创 QT对话框延迟关闭销毁

启动一个对话框后,过一段时间自行关闭销毁ReminderWidget::ReminderWidget(QString text, QWidget* parent) : QWidget(parent){ //设置去掉窗口边框、任务栏无标志、置于顶层 this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool | Qt::WindowStaysOnTopHint); //设置属性:关闭即销毁 this->setAttribu

2022-05-29 19:39:40 970

原创 夜神模拟器和mitmproxy抓包

安装mitmproxy1 mitmproxy官网下载mitmproxy2 安装mitmproxy3 打开mitmproxymitmproxy -p 88994 电脑端设置代理(否则开启代理后,电脑打不开网页)【windows 设置】->【网络和Internet】->【代理】5 验证mitmproxy在打开的网页中(第三步操作会有网页打开)下载安装证书6 找到windows证书下载后双击安装7 找到其他平台的证书下载(下图中Other Platforms)8

2022-05-02 10:08:52 2221

原创 C++获取网卡名称和IP地址

获取网卡名称和IP地址windows下建议用windows API来获取 参考链接linux下可用pcap或者是getifaddrs API(如果不需要MAC地址的话推荐)来获取 参考链接#ifdef _MSC_VER#include <WinSock2.h>#include <Iphlpapi.h>#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库#else#include <pcap.h>#

2021-10-25 16:13:53 2727

原创 QT常用参考

1:QT 判断鼠标是否在某个控件上

2021-08-11 16:45:41 394

原创 libpcap autoremove卸载引发的问题

记录一次异常操作导致的Ubuntu rviz异常问题当时的操作:执行了sudo apt-get remove libpcap-dev 卸载pcap的时候,提示autoremove,然后就选择了确认。结果把其他的依赖项给卸载了。后面导致RVIZ和系统设置里面的TAB全都无法使用。最后安装了opengl驱动后重启电脑解决了。OPENGL安装参考链接sudo apt-get install libgl1-mesa-dev...

2021-08-06 14:52:10 410

原创 Windows C++获取网卡适配器接口信息

Windows获取网卡适配器接口信息#include <pcap.h>#ifdef _MSC_VER#include <WinSock2.h>#include <Iphlpapi.h>#pragma comment(lib,"Iphlpapi.lib") //需要添加Iphlpapi.lib库#endifstd::vector<std::string> getLocalMachineNetworkAdapterList(){ pcap_if

2021-06-07 12:30:04 1776

原创 将文件夹下面的文件数据以数组形式保存到CPP文件中

将文件夹下面的文件数据以数组形式保存到CPP文件中,以std::map方式来索引文件信息。使用场景:不希望把文件数据直接暴露给用户。效果如下:代码参考:#include <qdir.h>#include <qicon.h>#include <qpixmap.h>#include <fstream>#include <iostream>struct MyIconInfo{ std::string name; s

2021-06-04 09:10:14 496

原创 QT资源文件的两种使用方式

QT资源文件的两种使用方式(CMake)通过Qt资源文件管理图片资源,qss样式表等。有两种方式使用Qt资源文件。第一种:将资源内容编译到可执行文件中,实现了图标等资源的封装,可达到防止恶意篡改的目的。第二种:使用rcc工具将资源文件qrc编译成rcc文件,然后在代码中动态加载。1:如何将资源文件qrc编译到可执行程序中第一步:生成资源文件qrc1:打开Qt designer,随便新建一个窗体(打开窗体后才能新建出资源文件)2:打开资源浏览器,点击编辑资源图标3:点击新建资源文件4:

2021-06-04 08:58:12 3349 1

原创 CMakeLists.txt文件中为APP添加图标

windows下在CMakeLists.txt文件中为APP添加图标一:准备ico图标通过 http://tool.je2s.com/ico/ 可以在线将图片转换成ico图标。上传图片后,导出ico文件命名为app.ico二:创建RC文件logo.rc,将下面内容粘贴到文件中IDI_ICON1 ICON DISCARDABLE “app.ico”文件如图所示三:在CMakeLists文件中将rc文件添加到源文件列表中四:将准备好的ico文件放置到和rc文件相同

2021-06-03 09:19:51 2677

原创 seekg返回失败

std::ifstream seekg返回失败问题描述:std::ifstream读取到文件结尾后,使用seekg会返回失败error处理方式:在seek之前,使用ifs.clear();ifs.clear(); before ifs.seekg(pos);参考链接:https://stackoverflow.com/questions/16364301/whats-wrong-with-the-ifstream-seekg...

2021-06-03 09:14:29 510

原创 QT获取文件信息

QT获取文件信息1:判断文件是否存在:Static bool QFileInfo::exists(const QString &file)或者bool QFileInfo::exists() const2:获取文件路径QFileInfo fi(“c:/temp/foo/123.txt”); => fi.absoluteFilePath() =>“C:/temp/foo”QFileInfo fi(“c:/temp/foo”); => fi.absoluteFile

2021-06-03 09:10:47 709

原创 QT表格动态刷新显示大量数据

Spreadsheet(QT表格动态刷新显示大量数据)代码链接:git代码链接效果图:

2021-06-02 08:58:44 3348

原创 网络问题排查

网络问题排查记录多网卡PING外部设备不通1:PC系统上面有两个网卡A和B,A配置的动态DHCP获取IP地址,用来访问外网,网络连接之后获取到10.10.x.x网段的IP地址。B配置的是静态IP地址 192.168.10.10,用于调试设备(设备IP地址是192.168.10.x)。问题复现步骤:1:A正常连接外网,B正常连接设备但是设备处于断电状态。2:ping设备的IP地址192.168.10.10。3:将设备上电。4:ping超时,大约1分钟只有才能ping通。问题原因:系统网络配置

2021-03-19 12:58:45 560

原创 Visual Studio 打开文件后显示不一致的行尾

问题现象:Visual Studio 打开文件后显示不一致的行尾“The line endings in the following file are not consistent. Do you want to normalize the line endings?”问题影响:可能导致Visual Studio的智能代码提示功能不能用原因:WINDOW下和LINUX以及MACOS下的行尾符号不一致,从网页上面COPY的代码包含的换行符号与VISUAL STUDIO打开的文件中的换行符号不一致。

2021-02-03 09:39:55 4906

原创 QT问题记录

开发过程中遇到的一些问题QT比较好的例子教程1: QChart折线图添加大量数据效率问题2:Qt 键盘事件与消息过滤器3:正则表达式:QRegExp rx("[0-9]{0,4}[.]{0,4}");4:Qt QLineEdit控件textChanged信号和textEdited信号区别5:Qt隐藏的功能和技巧6:可以参开自定义控件的实现,QT 自定义IP地址输入框7:QtChar...

2021-01-26 10:41:57 309

原创 Gitbook安装

1:下载node js 10.23.0版本注意,如果安装了其他版本的Node JS可能会导致初始化错误2:安装成功之后打开控制台可以看到node js的版本3:安装GitBook4:查看安装结果5:Gitbook如何生成一本书参考下面链接GitBook 准备工作做好之后常用插件...

2021-01-21 21:39:55 140

原创 疑难杂症

本文记录开发过程中遇到的各种奇怪问题1:Paraview 5.8.1编译的时候出现错误==“error: fatal error C1002: compiler is out of heap space in pass 2”==解决方式参考:https://discourse.paraview.org/t/fatal-error-c1002-compiler-is-out-of-heap-space-in-pass-2/3021具体操作:Disable VTK-m by setting the PAR

2020-10-16 16:18:02 593

原创 std::cin读取行数据

#include <stdio.h>#include <iostream>#include <string.h>#include <sstream>int main(int argc, char** argv){ int row, col; const int lines = 5;// how line to read from the std::cin std::vector< std::vector<std::

2020-09-11 09:35:29 698

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除