- 博客(69)
- 收藏
- 关注
原创 【GDB】调试Jsoncpp源码
我发现ret1返回的是false而前面的代码又没问题,然后我想着GDB调试一下吧看看parse内部咋回事(当时我Ctrl 点击这个reader->parse发现进入的一直是头文件,那时的我以为GDB调试一下就能进入parse的源码)后面就衍生出了诸多问题。最后得出的结论是调用ss.str()创建了两个不同的临时字符串对象,它们的指针指向不同的内存区域,导致parse函数收到了无效的指针范围。2.编译器可能进行优化,但不能保证。> - < 哭了,原来编译器优化也增加学习成本。可是我打印的地址都一样啊。
2025-12-16 22:05:55
262
原创 【Git】解决远程仓库备注错误问题
因为第二个红框我已经把spdlog改成 Learning from third-party libraries 这里我只复现当时怎么修改的问题。这是一开始的文件,我想把mystudy改成Learning from third-party libraries。之后我们就按照vim的一些常规用法进行修改这个文件把pick改成edit,后面的备注信息改成自己想要的内容。git rebase -i HEAD~n这个命令是一个历史编辑工具,这里我引入git官网文档的一段话。后面我们就按部就班的使用后面的两个命令。
2025-12-16 20:03:05
304
原创 【C++】AI中英翻译器
最近也学习了protobuf以及Ai的接口。下面我用我一个样例巩固一下自己的知识吧,这里的流程是客户端输入内容,把内容转发给服务器,服务器把用内容转给DeepSeek,DeepSeek从而进行翻译并把内容返还给服务器,服务器返还给DeepSeek。下面的代码我用的是阻塞式I/O,只能连接一个客户端。好久没写博客了,最近一直在实习没有时间写博客了,实习的过程很是曲折,一言难尽。希望春招能找个满意的公司吧,也祝愿大家工作顺利,也祝愿找还在找工作的朋友一切顺利。编译translation.proto。
2025-12-09 16:52:07
239
原创 VS2022-动静态库
这里我们先创建两个项目一个是MyLib和一个UsingLib。我们先把 MyLib属性调成静态库(点击项目的属性)之后创建一个.cpp文件mylib.cpp,这里我们就用来写一个加法运算吧!之后我们点击生成。下面这个图的意思是能够快速找到当前项目的文件路径,并不是库的路径!经过一番文件的翻阅我们找到MyLib下的MyLib.lib库---这是我的库路径 D:\Work_Demo\MyLib\x64\Debug之后我们在UsingLib这个库中的库目录-->添加库的路径,应用确认后编译。
2025-06-29 23:57:24
1311
原创 【Linux网络】多路转接之poll
poll() 和 select() 同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。select和poll系统调用的本质一样,poll的机制与select类似,与select在本质上没有多大区别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制(但是数量过大后性能也是会下降)。一个是select监视的fd有上限问题。
2025-06-15 15:36:45
465
1
原创 【Linux网络】多路转接之select
多路I/O转接服务器是一种高效管理多个I/O操作的技术,核心目的是允许单线程或单进程同时监控和处理多个I/O事件。另外为什么需要I/O多路转接呢?传统阻塞I/O模型中,处理多个客户端连接的常见方式是:为每个客户端创建一个独立线程,线程阻塞在read()或write()操作上,等待数据到达。这样会大幅度增加资源消耗,另外我们如果每个套接字设置为非阻塞,然后采用单线程轮询所有连接会造成CPU的浪费,如果采用多线程,依旧属于治标不治本。这时候就体现出I/O多路转接的核心价值了:用单线程高效管理多连接。
2025-06-14 19:13:04
770
原创 【Qt】信号与槽
槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何位置(public、protected、private),可以具有任何参数,可以被重载,也可以被直接调用(但是不能有默认参数)。槽函数与一般的函数的不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。另外connect要求,这俩参数(sender,signal)是匹配的,sender的类型如果是QPushButton* 此时第二个参数signal信号必须是QPushButton内置的信号或者是从父类继承来的信号。
2025-06-13 21:39:51
1009
2
原创 【数据结构】图算法(代码)
这里我用的上一章节中图的邻接矩阵的结构,进行遍历的。这里其实跟二叉树中,层序遍历思想差不多,都是前一个节点带后面的节点(A带B,C,D之后依次类推)当然这里有一个难点就是当我们遍历到B的时候我们插入队列的时候有AEC,但是我们只想要E,因为A已经pop掉了,C在队列中。我们该如何操作?用个数组标记一下全部元素,当前要插入队列中的元素是否用过,也就是说当我们元素插入到队列的时候标记一下。代码理解一下测试结果。
2025-06-10 10:53:21
1461
原创 【数据结构】图的存储(邻接矩阵与邻接表)
因为图中既有节点,又有边(节点与节点之间的关系),因此,在图的存储中,只需要保存:节点和边关系即可。节点保存比较简单,只需要一段连续空间即可,那边关系该怎么保存呢?
2025-05-31 21:26:34
1596
1
原创 【C++】位图
当我们设置一个数字进入位图里面,也就是我们要把相应的位图设置为1,同时又不能改变其他的位置标识。要表示8个数,我们就只需要8个Bit(1字节),首先我们开辟1字节的空间,将这些空间的所有Bit位都置为0,然后将对应位置为1。最后,遍历一遍Bit区域,将该位是一的位的编号输出(2,3,4,5,7),这样就达到了排序的目的,时间复杂度。如果第一个位图为1第二个位图为0,说明出现了2次,如果第一个位图为1第二个位图为1,说明出现了2次及以上。假如,我们存了10,20,30,40,48,那我们在位图中如何表示?
2025-05-30 20:58:43
622
原创 vscode连接本地Ubuntu
因为在学习项目的时候,自己的云服务器性能太差一直要编译很长时间,而且总是连接失败,所以搞了一个Ubuntu25.04的系统在自己的vmare中。看下面的文章解决完成后再回过头在看Windows下的VsCode软件使用SSH这篇文章,看完就OK了。接下来开始介绍一下vscode连接本地Ubuntu。先看这篇文章,如果遇到下面的错误。其中参考了以下文章。
2025-05-21 19:49:45
505
原创 C++ 回调函数
就是通过客户端发送一个apple,之后服务端通过回调进行发送一个苹果。下面写一个很简单的回调实际应用。这里只输出了客户端的消息。
2025-05-17 10:15:27
386
原创 【Linux】线程互斥同步
信号量本质是一把计数器,描述临界资源中资源数目的多少。比如你开了一家停车场,有 5 个停车位(资源)。信号量的初始值:5(表示有 5 个可用车位)。当车辆进入(线程 / 进程申请资源):如果有空位,允许进入;否则在门口等待。当车辆离开(线程 / 进程释放资源):腾出一个空位,唤醒等待的车辆。(1)P 操作(Wait)目标:申请一个资源(如停车位)。步骤检查信号量值:若信号量 > 0 → 可用资源足够。原子减 1:占用一个资源(信号量 = 信号量 - 1)。若信号量 ≤ 0。
2025-03-30 20:01:48
1046
原创 【Linux】线程库
tid其实是一个地址首先,我们知道pthread. h不是操作系统的接口,而是。那么用户创建的线程,操作系统无法管理,则需要线程库来进行管理。他从系统中获取轻量级进程相关属性,从用户中也获取一些属性,这样就先描述起来了,再通过数据结构将线程组织起来,就将线程管理好了。那么线程库如何管理呢,在哪管理呢?在进程地址空间中,通过mmap(共享区)加载了动态库,我们使用的pthread库就在该区域。pthread库会管理进程中的每一个线程,它使用一系列的数据结构(如线程控制块)来组织和维护线程的相关信息。
2025-03-23 20:43:17
589
原创 【Linux】重谈地址空间
Soft Page Fault 也被称为 Minor Page Fault,翻译为软缺页错误 / 次要缺页错误,这时物理内存中是存在对应物理页的,只不过可能是其他进程调入的,发出缺页异常的进程不知道而已,此时 MMU 只需要建立映射即可,无需从磁盘读取写入内存,一般出现在多进程共享内存区域。假如我们只有一个4kb大小的程序我们叫他为main,我们编译链接形成的是ELF格式,当我们main程序在运行,虚拟地址初始化操作系统为进程分配独立的虚拟地址空间,并根据 ELF 文件的。如果页号非法,则为越界访问。
2025-03-16 22:01:02
824
1
原创 【Linux】进程信号
信号是一种用户、OS、其他进程,向目标进程发送异步事件的一种方式。例如:ctrl + c 终止前台进程,就是信号。使用kill -l就可以看到所有的信号 ,我们把前三十一个称为普通信号(也称为不可靠信号),都是大写的宏,前面的数字就是宏对应的值。man 7 signal可以查看更详细的信号手册(没有截全)
2025-03-12 00:07:27
794
原创 【Linux】共享内存
共享内存本质上就是内存中的一块区域,用于进程间通信使用。该内存空间由操作系统分配与管理。与文件系统类似的是,操作系统在管理共享内存时,不仅仅有内存数据块,同时还会创建相应结构体来记录该共享内存属性,以便于管理。因此,共享内存不只有一份,可以根据需求申请多个。进程之间进行通信的时候,会获取到共享内存的地址,写端进程写入数据,读端进程通过直接访问内存完成数据读取。
2025-02-28 10:43:38
1159
原创 【Linux】匿名管道
管道是Linux中的最古老的通信方式,我们把一个进程链接到另一个进程的一个数据流称为一个"管道"。linux中指令 | 这个被称为管道符。通过管道符 | 创建的管道是匿名管道,用完了就会被自动销毁。需要注意的是,匿名管道只能在具有亲缘关系(父子进程,兄弟进程,爷孙进程)的进程间使用。也就是说,。
2025-02-19 20:06:15
494
原创 【Linux】文件系统
所以我们对一个目录没有r权限的时候,查不了文件内容,因为对目录没有读权限,就无法读取目录的data blocks,系统不让读,读不到,就得不到文件名和inode的映射关系,拿不到inode怎么可能访问到文件。例如,如果你访问 /var/log/syslog,首先检查 / 是挂载在 /dev/sda1 上,然后检查 /var 是否是一个单独的挂载点。例如,如果 / 被挂载在 /dev/sda1 上,那么 / 及 / 下的文件和目录都属于 /dev/sda1 分区。里面的内容包括文件名的inode码。
2025-01-22 18:18:17
819
原创 【Linux】文件描述符fd
我们重新回到2.1open的返回值那块看看返回文件描述符fd,数据类型为整形int main()//以只写方式打开,如果文件不存在则创建if(fd1<0)return 0;return 0;fd1: 3此时文件标识符为3,为什么文件打开从3开始呢?因为进程启动,默认打开了三个标准的输入输出流:stdin,stdout,stderr因为Linux下一切皆文件,这三个标准的输入输出流被当成文件打开了。int main()//以只写方式打开,如果文件不存在则创建。
2025-01-15 18:09:29
1201
原创 【Linux】模拟Shell命令行解释器
snprintf() 是 C语言的一个标准库函数,定义在<stdio.h>头文件中。snprintf() 函数的功能是,并将结果存储在指定的字符数组中。参数returnn。
2025-01-10 23:55:59
936
原创 【Linux】进程控制
在linux中fork函数是非常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:分配新的内存块和内核数据结构给⼦进程将⽗进程部分数据结构内容拷⻉⾄⼦进程添加⼦进程到系统进程列表当中fork返回,开始调度器调度。
2025-01-08 17:37:26
752
原创 【Linux】进程地址空间
我们在学习C/C++的时候总是会经常的看到这种内存分布图,我们之前所理解的是程序地址空间,而不是进程地址空间。程序地址空间是指程序在编译链接后,理论上所占据的虚拟地址范围。它是一种静态的概念,主要是由编译器和链接器确定的。进程地址空间是一个进程运行时可以访问的虚拟地址空间,是一种动态的概念。它是在程序执行过程中,。我们先验证一下进程地址空间的基本排布。
2024-12-07 14:09:33
1168
原创 【Linux】命令行参数&环境变量
main 函数⼀共有三个参数,在命令行部分先关注前两个参数:1、:表示命令行参数的个数2、表示命令行参数的清单这里我们可以看到命令行,argc中显示的参数个数,argv命令行参数的清单内容为什么要有这两个参数呢?因为同一个程序,可以根据命令行参数,根据选项的不同,表现出不同的功能。就比如常用指令ls -a,ls -d。main函数的参数是谁给传递的呢?在上进行输入指令加选项,他是,首先会被拿到,根据空格为分隔符进行打散,形成一张表argv[]和元素个数argc。
2024-12-01 18:09:39
962
原创 【Linux】自动化构建工具-make/Makefile
make:一条命令makefile/Makefile:一个文件。文件里面写依赖关系与依赖方法两个搭配使用,完成项目自动化构建。<Tab>必须是隔一个Tab建。代码解析::目标文件。:依赖文件列表。对于proc:proc.c,冒号左侧是目标文件,右侧是它的依赖文件,所以就可以说它们之间存在一种proc:proc.c下面的语句gcc -o proc proc.c叫做:表示声明一个伪目标。(类似于关键字)。:伪目标的一个名称。(类似于变量名)。:clean:单独一行表示这一行的依赖关系,没有依赖列表。
2024-11-11 19:36:49
1222
原创 【C++】智能指针
RAII(Resource Acquisition Is Initialization)是一种(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们。这种做法有两大好处:1.不需要显式地释放资源。2.采用这种方式,对象所需的资源在其生命期内始终保持有效。下面介绍3种智能指针,智能指针最重要的就是拷贝构造。
2024-11-03 10:29:00
837
原创 【C++】异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。
2024-10-30 16:43:32
607
原创 【C++】哈希表
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到log2N,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器(unordered_map,unordered_multimap,unordered_set,unordered_multiset),
2024-10-16 20:32:33
1443
原创 【C++】红黑树
RED,BLACK:_kv(kv), _col(RED) // 颜色默认给成红色{}思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?答:优先插入红色不一定能破坏红黑树的性质,如果破坏性质可以通过调整红黑树的颜色来进行修改,但是插入黑色直接破坏红黑树的性质。
2024-10-06 20:37:08
2297
2
原创 【C++】AVL树
AVL的概念:左右子树高度差不超过1因此要在二叉搜索树上增加一个平衡因子(来记录左右子树的高度差),当平衡因子超过1时,就要更新向上调整父节点的平衡因子(因为子节点的平衡因子发生变化,间接的导致父节点的平衡因子发生改变),这时就要知道父节点的位置,因此在二叉搜索树上要多维护一个父节点的指针。int _bf;, _bf(0){}
2024-09-29 22:36:13
747
原创 【C++】map与set
序列式容器vector、list、deque其底层为线性序列的数据结构,里面存储的是元素本身。关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高(注:键值对用来表示具有关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
2024-09-23 19:27:09
1113
原创 【C++】多态
也就是说下图中不同类域中的BuyTicket之间也是有隐藏关系的(有些概念不清楚可以看我上篇写的继承)派生类屏蔽了父类同名函数BuyTicket,打印的是半价,指定类域后打印的是全价可以认为重写是一种特殊的隐藏。隐藏包含重写。
2024-09-08 12:02:23
776
原创 【C++】继承
1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。2. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。继承和组合public继承是一种is-a的关系(Car和BMW Car和Benz构成is-a的关系,总类的细分支)。也就是说每个派生类对象都是一个基类对象。
2024-08-31 12:45:55
1347
原创 【C++】模板进阶
与。类型形参:出现在模板参数列表中,跟在非类型形参:就是用一个,在类(函数)模板中可将该参数。下面size_t N中的N为非类型形参,class T中的T为类型参数。C++20之前,只允许整形做非类型模板参数C++20,可以支持double(x64)等内置类型注意:1. 浮点数(float(x86,x64),double(x86))、类对象以及字符串是不允许作为非类型模板参数的。2. 非类型的模板参数必须在编译期就能确认结果。这里介绍一个非常鸡肋的头文件先说这个好处,这个头文件的好处。
2024-08-27 11:00:15
960
原创 【C++】stack和queue
stack就类似于我们数据结构所学的栈stack是一种容器适配器什么是适配器适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。举个例子:某插头要求输入:100-240V~,50/60Hz,0.7A输出:5V==3A/9V==3A/12V= 2.25A 20V=1.35A/11V=3A Max这就是适配器。
2024-08-14 15:35:52
973
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅