- 博客(44)
- 收藏
- 关注
原创 如何用vs studio调试qt程序,和动态库程序
软件对外发布的时候时release的,但是我们需要对应发布版本时的代码,作为出现问题时调试用。所以在发布的时候生成对应的pdb。安装qt时安装 msvc2019 的编译器,qt creator构建工程时也要用msvc的编译器,为了调试方便。2.程序启动后就加载了my_log动态库,点击调试 -> 附件到进程。刚才的例子中 住程序gui暂时没有配置生成pdb,my_log生成了pdb了。1.选择要留存pdb文件的模块,如my_log。这时候再右键生成的时候,在指定的路径下就会生成pdb文件了。
2024-05-19 11:59:56
1025
原创 c++程序员通用成长规划
要有一个长期的学习计划,确定学习方向,拆分为各个模块,每天学习多少,根据实际情况灵活调整,一切以当前实际工作为主后续发展为辅,并且要坚持。这里的坚持不是强制的,比如今天有事学习计划不能执行或今天就是懒了不想学了就放弃长期学习的规划。哪怕中间断了一个月或者几个月,再想起学时都不要摆烂觉得自己都断了这么长时间了怀疑自己不是个有毅力的人而直接放弃学习。种一颗树的最佳时机是十年前,其次是现在。这句话任何时候想起都为时不晚。学习的东西要懂得梳理分类记录到自己的笔记中,看到好文章可以直接复制或者记录下网址。
2024-04-17 15:07:02
1112
1
原创 那些年踩过的坑
使用自定义比较函数时 手欠,元素对比 写了 return a <= b;结果数组越界,程序崩溃。sort内部算法优化,必须保证比较函数保证弱序。
2023-06-08 11:13:03
174
原创 std::unique_lock 和 std::lock_guard
是 C++ 标准库中用于管理互斥锁的类模板,它们都提供了简化多线程编程中互斥访问的机制,但在功能和灵活性方面存在一些区别。是一个更灵活和功能更强大的互斥锁管理类。它提供了更多的操作,如延迟加锁、手动释放锁、尝试加锁和超时加锁等。对象一旦被创建,就会锁定互斥锁,一旦对象离开作用域,就会自动释放互斥锁,确保在任何情况下都不会忘记释放锁。是一个轻量级的互斥锁管理类,它通过构造函数获取锁,析构函数释放锁。具有更大的开销,因为它需要使用动态分配的资源来管理锁的状态。更适合简单的锁定范围,并且不能显式地释放锁。
2023-05-24 20:52:41
1099
原创 函数 prctl 系统调用
是一个系统调用,用于控制和修改进程的行为和属性。它可以在Linux系统上使用,提供了各种功能和选项来管理进程的不同方面。每个选项都有特定的参数,可以根据需要传递。具体的参数和行为取决于所选的选项。函数将当前进程的名称设置为"MyProcess"。函数时,应该查阅相关文档并了解所使用的操作系统的支持和限制。函数的具体行为和可用选项可能因操作系统和版本而异。选项和参数,用于执行不同的操作。函数获取进程的名称,并将其打印到标准输出。以下是一个简单的示例,展示了如何使用。这些仅是一些常用的选项,
2023-05-23 10:15:17
4470
原创 【与代码编译相关的东西】
该选项告诉编译器将所有未显式声明为可见的符号(如函数和变量)标记为“隐藏”(hidden),以使它们对链接器不可见。这样,可以避免在链接时将未使用的符号链接到可执行文件中,从而减小可执行文件的大小。这样,在链接时可以更容易地剔除未使用的变量,从而减小可执行文件的大小。这样,当链接器(ld)进行链接时,可以更容易地剔除未使用的函数代码,从而减小可执行文件的大小。需要注意的是,使用这些选项可能会对代码的可读性和调试性产生一定的影响,因为代码被拆分成多个小段,导致可读性和调试时的代码映射变得更加复杂。
2023-05-16 11:13:53
188
原创 git冲突解决(命令行)大全CTMD
冲突前言场景一、拉取远端分支代码时产生冲突解决方案场景二 、与远程分支都修改了同一个文件解决方案前言工作两年多了,用git总会发生冲突。因为是嵌入式入的行一直在ubuntun里写代码 ,提交代码习惯了命令行敲命令。小乌龟软件据说很好用,后期学学。项目开发总遇到冲突,之前都是把自己的新写的代码拷出来。然后把修改的文件撤销,git pull拉代码。再把新代码写回去。为啥用这么土的方法呢?因为自己出身培训班,git、svn都是参加工作的时候接触的。面试的时候装杯说自己会用。遇到冲突了百度一下解决方法,也没 解
2022-03-11 11:54:20
4796
原创 c++外观模式
外观模式简介UML优点缺点代码参考简介在MVP架构的软件分层框架下常见。对应界面来讲我点击一个按钮不需要知道底层完成这个业务的步骤细节。只需要P层提供一个接口用于调用即可。在分层软件框架下外观模式常被使用在层与层之间。UML优点(1) 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。(2) 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类
2021-12-22 15:09:00
866
原创 std::vector的原理之一begin()和end()
@TOC前言同事遇见个bug,在一个容器中使用std::find寻找指定元素,找到后将一个标志位置位。但是log数据找到了指定元素,但实际容器中却不含有此元素。伪代码void findElement(const vector<int>& vec, int key){ auto it = find(vec.begin(), vec.end(), key); if (it != vec.end()) { // setFlag(true);
2021-12-22 11:13:31
1963
原创 explicit 与变量初始化时的隐式转换
explicit 与隐式转换隐式转换代码说事explicit隐式转换类变量刚被定义时使用 = 一个非同类的其它类型变量;其实是调用对应的构造函数。进行初始化,这一过程是编译器识别的。 = 一个同类的变量则是调拷贝构造(此篇文章不讲)代码说事#include <iostream>using namespace std;class Test{public: Test() { cout << "Test()" << endl;
2021-12-14 16:58:07
924
原创 c++组合模式
c++组合模式简介UML优点缺点使用场景代码简介将对象组合成树形结构以表示"部分-整体"的层次关.组合模式使得用户对单个对象和组合对象的使用具有一致性.UML优点高层模块调用简单;高度自由缺点叶子和树枝的声明都是实现类,违反了依赖倒置原则.使用场景1.你想表示对象的部分-整体层次结构。2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。代码代码已公司架构为例。阿里总公司旗下北京分公司旗下高德地图,杭州总部旗下得支付宝,淘宝 等。...
2021-10-27 21:12:05
364
原创 c++桥接模式
c++桥接模式简介UML优点缺点代码简介这是这些设计模式里,理解上最费劲的模式了。将抽象化(Abstraction)与实现化(Implementation)分离,使得二者可以独立地变化。以前我们实现一个接口直接使用继承 就好了。桥接模式则是把继承关系转化成了 组合关系。实现 了 抽象 与 实现 分离。UML优点1.将实现抽离出来,再实现抽象,使得对象的具体实现依赖于抽象,满足了依赖倒转原则。2.将可以共享的变化部分,抽离出来,减少了代码的重复信息。3.对象的具体实现可以更加灵活,可以满足
2021-10-25 21:29:25
518
原创 c++适配器模式
c++适配器模式简介UML优点缺点代码简介将一个类的接口转换成客户希望的另外一个接口UML优点可以将不符合要求的接口转换为需要的接口。缺点多了个适配器类出来代码能用组合实现的一般不推荐使用继承,所以代码中类模式轻易不要用#include <iostream>using namespace std;class ITarget{public: virtual void request() = 0;};class Adaptee{public:
2021-10-24 21:07:54
305
原创 C++装饰者模式
C++装饰者模式简介UML优点缺点代码理解简介时常会遇到这样一种情况,我已经设计好了一个接口,并且也有几个实现类,但是这时我发现我设计的时候疏忽了,忘记了一些功能,或者后来需求变动要求加入一些功能,最简单的做法就是修改接口,添加函数,然后继承类中都相应的添加实现,这样做倒也没什么问题,但是如果这种变化来个好几次或者继承类非常多,那工作量可就大了。这时大神们就发明了装饰者模式,在不修改现在有接口和实现类的基础上实现功能或者状态的添加。UML优点1.可以不用修改原有的接口,就可以实现新功能的添加。
2021-10-24 20:30:00
2172
原创 c++11新特性遇见一个记一个
c++11新特性遇见一个记一个std::functionstd::movestd::functionstd::function是函数模板类(是一个类);std::bind是函数模板(是一个函数);#include <memory>#include <iostream>#include <functional>using namespace std;void hello(){ cout << "hello" << endl;
2021-10-19 20:13:31
497
原创 c++代理模式
c++代理模式简介UML优点缺点使用场景代码参考简介代理模式也称为委托模式。作用就是找一个对象来替我们访问某个对象。意图:为其他对象提供一种代理以控制对这个对象的访问。UML1.Subject:定义RealSubject和Proxy的共用接口,这样就可以在任何使用RealSubject的地方都可以使用Proxy。2.RealSubject:真实处理业务的角色。3.Proxy:保存一个引用使得代理可以访问实体。优点职责清晰:真实角色就是实现实际的业务逻辑,不关心其他非本职责的事务,通过后期
2021-10-19 15:59:00
220
原创 c++建造者模式
c++建造者模式简介优点缺点使用场景代码实例参考文章简介建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这是建造者模式的标准表达,不过看着让人迷惑,什么叫构建和表示的分离?一个对象使用构造函数构造之后不就固定了,只有通过它方法来改变它的属性吗?而且还要同样的构建过程搞出不同的表示,怎么可能呢?多写几个构造函数?其实多写几个构造函数,根据不同参数设置对象不同的属性,也可以达到这样的效果,只是这样就非常麻烦了,每次要增加一种表示就要添加一个构造函数,将来构造函数会多得
2021-10-18 17:32:16
207
原创 c++单例模式
c++单例模式简介代码参考简介因为在设计或开发中,肯定会有这么一种情况,一个类只能有一个对象被创建,如果有多个对象的话,可能会导致状态的混乱和不一致。这种情况下,单例模式是最恰当的解决办法。它有很多种实现方式,各自的特性不相同,使用的情形也不相同。今天要实现的是常用的三种,分别是饿汉式、懒汉式和多线程式。通过单例模式, 可以做到:确保一个类只有一个实例被建立提供了一个对对象的全局访问指针在不影响单例类的客户端的情况下允许将来有多个实例具体细节见:单例要注意的地方代码参考原文链接:ht
2021-10-14 17:20:05
93
原创 c++原型模式
c++原型模式简介特点缺陷代码使用场景简介UMl特点可以在程序运行时(对象属性发生了变化),得到一份内容相同的实例,但之间还不会相互干扰。缺陷使用场景跟拷贝构造相似度很高,能用拷贝构造(注意考虑深浅拷贝)解决不用非得搞设计模式。注意但是使用了原型模式就是不想暴露给用户对象创建过程。只能通过clone来获取对象的拷贝。和工厂模式可以搭配,隐藏对象的创建细节。代码#include <string>#include <iostream>using namespa
2021-10-13 20:26:23
264
原创 c++工厂模式总结
工厂模式工厂模式种类单工厂模式特点缺陷工厂方法模式特点缺陷抽象工厂模式const
2020-12-23 10:30:44
383
原创 std::this_thread::sleep_for和std::this_thread::yield还有sleep的区别与使用。
学无止境环境std::this_thread::sleep_for和sleepstd::this_thread::yield不加std::this_thread::yield()加std::this_thread::yield()总结环境本文无特殊说明均指linux环境std::this_thread::sleep_for和sleep这哥俩没啥太大区别都是表示当前线程休眠一段时间,休眠期间不与其他线程竞争CPU,根据函数参数,等待相应时间时间。只是一个是C的函数一个是c++的函数分别对应头文件 &l
2020-12-21 20:45:26
2015
原创 进程的执行状态与线程时间片的分配
学无止境环境线程的时间片分配线程的执行进程的状态三个状态状态的迁移环境无特殊指明,本文基于linux线程的时间片分配对linux系统来说,用户创建进程后,CPU分配时间片的单位其实是按线程分的。假如你的程序里没有创建线程,你可以把它看成是一个单线程程序,Linux内核其实不区分进程和线程,内核把执行单元叫做任务(task)。线程则是最小的工作单元。对于有子进程的程序来说,当该进程刚被其父进程fork出来时,是平分其父进程的剩余时间片的。这个时间片执行完后,就会根据它的初始优先级来重新分配时间片l
2020-12-21 20:42:52
6364
原创 c++临时线程的技巧与detach函数的应用
分析c++的临时线程应用场景举例C++线程类闪亮登场思路见代码代码分析避坑c++线程类小小总结c++的临时线程所谓的临时线程指的是,本身此线程不在项目的设计框架之内,就是满足异步执行一个临时任务,而不拖延主时序的进行而生。应用场景举例UI层点击按钮刷新歌曲列表,肯定是将UI的点击事件绑定到底层的搜索函数find()(随意起的名字),如果在find中等待程序搜索完成再向上返给UI层。那么程序会卡住find函数中等待事件处理结束。这时候我们一般都会采取异步设计。比如,通过find()触发线程来执行搜索歌
2020-12-18 11:34:04
806
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人