- 博客(37)
- 收藏
- 关注
原创 C++ weaks_ptr弱引用智能指针
Child->pa析构(即 weak_ptr 析构),Parent_Weaks减一,变为0。-----spc指向的Child类中,含有可指向Parent类的pa智能指针,再使pa指向上述构建的spa。-----spa指向的Parent类中,含有可指向Child类的pc智能指针,再使pc指向上述构建的spc。-----可指向Parent类的spa智能指针,指向使用new构建的Parent对象,引用计数值为1。-----可指向Child类的spc智能指针,指向使用new构建的Child对象,引用计数值为1。
2025-10-15 16:53:19
459
原创 C++ my_shared_ptr共享性智能指针
shared_ptr多个共享智能指针 管理 同一个资源(一个或一组)为什么要有这样的特点?而不是一个智能指针 管理 多个资源?1.多个指针管理同一个资源,当所有指针都销毁时,资源才被释放。一个指针管理多个资源,很难精确控制每个资源的生命周期,要么全部释放,要么都不释放,缺乏灵活性。每个资源应该有独立的生命周期管理。3.资源的生命周期与对象绑定,每个资源有明确的所有权关系。(注意 以下代码中的"只共享a.txt的访问",如果是一个智能指针 管理 多个资源。
2025-10-11 15:55:14
691
原创 C++内存管理库 --智能指针
class C<T*,U*>{} //部分刻画 "部分确定 int* double* char* ... "class C<const char*,const char*>{} //完全刻画 "完全指名道姓,类型极其确定"动态申请空间后,指针丢失 ---内存地址丢失。资源泄漏 :socket,文件描述符等创建却不归还。.智能指针对象的方法 -> 指向类型的方法。无左值右值概念 与STL相容性差。
2025-09-29 00:18:27
221
原创 C++多线程
while() {}//虚假唤醒 //唤醒之后,因条件不满足,再次被放入条件变量的阻塞队列,阻塞。std::thread::hardware_concurrency()//获得逻辑核数。std::thread thc(str::move(tha))//移动线程。
2025-09-22 23:19:16
601
原创 Lambad表达式
auto fr= [ this ] () //this 指针的捕获 //但静态成员函数无this指针,不可以捕获this。[=] 按值捕获 //在定义时 创建副本,//不是在调用的时候才创建 地址不同 //具有常性,不可修改。//省略 -> int。lambad无法捕获自己,但可以捕获其他lambad表达式 //不可以递归。//erro [=,&] [&,=] //erro //矛盾。//[=,&x] //x按引用捕获。//[&,x] //x按值捕获。
2025-09-19 21:40:18
271
原创 C++ static 关键字
/字面常量 编译器会优化 不会有执行到这条语句的概念,而是在程序执行之初直接完成初始化 ,只初始化一次。const 成员常方法中的static变量的值仍然可以更改,因为它无this指针 //const修饰的是this指针。//static保证只初始化一次。//static void funa() 静态函数 //为所有对象共享 无this指针。//程序运行到这一句就初始化,只初始化一次。static成员变量 //无this指针 在数据区。通过static修饰对象,达到只初始化一个对象的目的。
2025-09-10 13:54:17
311
原创 C++小计
加this指针改写函数 : 在形参中加入this指针void setReal(double r) ---> void setReal(complex *C++ 编译器步骤:编译器对类的属性成员识别 : 名称 类型 可访问属性 放入一个临时文件 描述符表 中sizeof() 对象的定义。对象对函数调用的改写 : c1.setReal(1.2);函数名相同,参数个数和类型不同(即参数列表),不能以函数的返回值进行区分。对内置类型的引用 通常采取隔离方式(不同的编译环境方式不同)
2025-09-02 21:39:23
360
1
原创 嵌入式 - STM32 HAL 库 部分常用函数
当调用此函数时,HAL 库会直接操作芯片的寄存器,修改对应引脚的输出数据寄存器 (该操作是原子性的,适合实时控制。:读取指定 GPIO 引脚的当前输入电平(高电平或低电平)。:通过指定端口、引脚和电平状态,实现对硬件信号的直接控制。提供了比手动读取-修改-写入更高效的电平翻转方式。)翻转输出寄存器(ODR),比手动读取-修改-写入更快;直接设置指定 GPIO 引脚的电平为逻辑高 (原子操作:不会被中断打断,确保电平翻转的完整性。,避免接触不稳定对于电平检测的影响。),从而改变引脚的实际电平状态。
2025-06-10 12:23:07
1006
原创 Ubuntu 笔记 -shell(1)
若在函数内部的变量前加 local ,则此变量只在函数内部有,在函数外就没有了;对原文件进行更改,然后把更改后的内容保存到新文件中,原文件没有被改动。函数里面的变量 仍然在解释器里 所以函数执行完后,变量的值仍然存在。写到函数外面,则表示整个脚本的参数;写在函数里面则表示函数的参数。接受方 echo mystr=$1 收到的第一个参数。例:将浮点数中的整数部分提取出来 (小数点 将其分为左右两个域)./b.sh 调用b.sh脚本,但b.sh的解释器是单独的。函数没有声明,需写在脚本的最前面。
2025-06-09 21:30:15
345
原创 Ubuntu笔记 -shell语句
shell 语法:变量,条件,循环,case,函数,脚本调用,c语言调用脚本,awk。zhi运行需要解释器,如bash,sh,python,tcsh等。如 先存hello 然后b=hello b指向hello。若有空格,则必须加双引号 str="hello abc"解释执行:解释器先执行,再读取二进制文件,逐句执行。然后c=b 然后c再指到b指向的位置。变量在解释器中定义;100也作为字符串,也可作为整型。先存某些值 然后变量再指过去。str只能是字符串;子进程可继承环境变量。
2025-06-07 12:19:09
249
原创 Ubuntu笔记 -redis
乐观锁:当一个线程在修改某一个数据的时候,乐观地认为不会有其他线程会对此数据进行修改,只在提交的时候检查一下是否有人在此线程运行期间修改过此数据。如果有人修改过,则放弃此线程过程中的修改,返回失败;或者重试,直到未发生碰撞,顺利完成线程中的修改。3.所有的命令在事务中,并不会被直接执行,而是只有发起exec执行事务命令的时候才会执行。但当某条语句出现语法错误时,此条语句不会被执行,而其他语句会正常被执行。当某条语句出现命令错误时,所有命令都不会被执行。1.redis的事务没有原子性。
2025-05-21 19:17:35
175
原创 Ubuntu笔记 -MYSQL事务
例:如在可重复读的隔离级别中,若事务B插入,删除某些满足事务A查询表中的数据,但由于可重复读隔离的特性,导致在事务A未提交前,其都是无法察觉到因其他事务的进行所造成表中数据的改变的。例:如果A事务中多次查询的数据在B事务中正在被修改,在B事务未提交前,A事务所查询到的数据和之前相同,但只要B事务提交后,A事务就可查询到经过B事务修改后的数据。:即使其他事务提交了,但只要当前事务未提交,则当前事务所查寻到的数据从始至终都是一致的。隔离级别:未提交读,提交读,可重复读,不可重复读。
2025-05-19 17:53:22
170
原创 Ubuntu笔记 - mysql
ALTER user 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码';2.create table student(内容 类型,内容 类型);查看当前表中内容,此时为空)-mysql -uroot -p (登录数据库)create database 数据库名。drop database 数据库名;(student 为表名)2.改密码(管理员身份)1.下载(管理员身份)选择需要创建表的数据库。1.use 数据库名。
2025-05-12 22:38:44
199
原创 Ubuntu笔记 - IO复用方法
再将fdset集合y交给selsct,selsct再将fdset中没有数据的位从1变成0。再将fds添加到fdset集合中,fdset通过偏移量把有描述符的对应位从0变成1。- 原 服务器端并发处理多个客户端 使用多线程处理 问题:阻塞 替换开销大。先检查那个客户端有数据,再处理。(使用fdset只作为一个中转 因为selsct只能接受fdset的类型的数据)(selsct每次会改变time的值,所以每次循环都要再赋一次time的值)再通过selsct返回的个数为参考遍历原fds,寻找就绪的事件。
2025-04-26 22:26:36
258
原创 Ubuntu笔记 - HTTP协议
HTTP协议 应用层协议 端口号:80 (https 端口号:443)html;在传输层使用TCP协议。短链接:一次请求,一次应答后close。长链接:可多次请求,并多次应答。需在管理员权限下运行。
2025-04-25 15:28:48
264
原创 Ubuntu笔记 - 连接状态
避免关闭方最后发送的ACK丢失,超时再次重发,关闭方还可以正常接受重发的ACK,使得被动关闭方的关闭正常进行。因新的进程的地址和端口和上一个相同,避免延迟报文发至新的进程,所以等待延迟报文的到达,并丢弃掉。无连接 只要ip端口正确,多个客户端 或者 服务器断开又重启 都可以发送数据。(TIME_WAIT 状态大约存在两分钟,为正常报文生命周期的两倍)收发次数一一对应 发一个收一个,即使没收完,下次也不再收了,会接收新的。TCP:面向连接的 可靠的 流式服务。UDP:无连接的 不可靠 数据报服务。
2025-04-19 11:19:12
227
原创 Ubuntu笔记 - 网络
IOS七层模型 :应用层 表示层 会话层 传输层 网络层 数据链路层 物理层。实践应用:应用层 传输层 网络层 网际接口层(数据链路层 物理层)端口号 主机上某个应用程序的代号(编号)传输层协议 tcp/udp协议。网络层协议 ip地址协议。TCP协议 编程流程。
2025-04-12 17:10:27
239
原创 Ubuntu笔记 - 线程安全
主线程和子线程对外呈现的id相同(4808)(子线程在linux中以进程的方式实现)内核级x'c可以感知多个线程的存在,可以并发 使用多个处理器 同时执行多个线程。用户级内核无法感知多个线程的存在,只能并行 使用一个处理器 交替执行各个线程。strtok函数中只有一个指针,只能记录一个buff的分割位置。子线程(可看成一个新的进程)和主线程(main进程)共享资源。故此函数不是可重入函数,不能在多线程中使用!2.同步:信号量 互斥锁 读写锁 条件变量。只运行fork所在的行路径(线程)
2025-04-10 21:04:10
112
原创 Ubuntu笔记-线程同步2
wait 进入后先解锁(与wait前的加锁配合) 出去前再加锁(与wait后的解锁配合)Linux线程同步方法:信号量,互斥锁,条件变量,读写锁。
2025-04-06 16:25:30
205
原创 Ubuntu笔记-线程
会出现同时加减,即多个线程同时读取到此刻i的值(例如i=3),多个线程同时进行操作(i++),结果并不会分别加加得到(i+n)的值,而会出现i=4的结果。申请创建线程时,系统也会有调度问题,即先申请的,不一定会先被创建(即打印不一定全会出现0 1 2 3 4 )i++进行的十分的快,只能拿到i此刻的值,所以会出现相同的值(会出现相同的值)并行:还有两个处理器 在一段时间内同步执行。避免主线程先结束,导致其他线程也结束。:进程内部的一条执行路径(序列)(并行是一种特殊的并发)(线程间的pv操作)
2025-03-27 21:32:59
165
原创 Ubuntu笔记 -文件操作补充
这种实现方式与上述的 1. 相同,若执行多个printf函数的调用,则会不断的实现从用户态到内核态的切换,造成资源浪费。(在此过程中要保证a.jpg在程序的文件中,且系统可以正常查看a.jpg.当然了,其他的图片格式也可以。而缓冲区的实现,使得在多个printf函数的调用下,只进行一次从用户态到内核态的切换,避免资源浪费。fork后子进程会复制父进程的缓冲区内容,在进程结束后,打印缓冲区内容。// ./mycp a.jpg(原图) b.jpg(完成复制后的图)可结合上述内容,分析下面BAA的打印过程。
2025-03-09 23:58:50
387
原创 Ubuntu笔记 -写时拷贝
除栈对于安全性出现的抖动现象,每个文件的逻辑地址(即各量在文件中的偏移量)不会随着运行次数而改变。(物理地址会在每次运行时,重新分配内存空间)(页表 会完成逻辑地址到物理地址的映射)当父进程使用fork方法时,对于子进程的拷贝不是立即发生的,而是而是父子进程共用同一块物理页。只有当父或子某一方出现改写的时候,子进程才会复制当前与父进程内容不一样的内容到新的物理内存页。此处打印的为逻辑地址,故打印出来的每个n的地址相同。根据以上的 fork写时拷贝 和 逻辑地址 内容,可解释下面代码的运行结果。
2025-03-07 17:45:20
222
原创 Ubuntu笔记 -fork进程复制
此时系统会给子进程重新分配父进程(被 init 进程接管,init 会调用wait),获取子进程的退出码,避免其成为僵死进程。(当子进程比父进程先结束的时候,子进程会释放除PCB外的内容,导致其不同于一般的进程的三大状态(就绪,阻塞,运行))(而只有当父进程获取到子进程的退出码后,才能清除掉子进程的PCB信息,即彻底清除子进程,使其的状态不再为僵死状态)(操作系统需确保父进程有权知道子进程的执行结果,这是多进程协作的基础):子进程先于父进程结束,使得父进程未能获得子进程的退出码。//val获取退出码。
2025-03-01 23:13:30
237
原创 Ubuntu笔记 -进程复制与替换(1)
2.强制刷新缓冲区 '\n',fflush。argc : 参数个数。argv : 参数内容。envp : 环境变量。
2025-02-24 17:54:24
207
原创 Ubuntu笔记 -静态库和共享库
如:gcc -shared -fPIC -o libfoo.so add.o max.o。( -L后面跟库的位置 如:-L.表示当前位置;2.gcc -o main main.c -L路径 -l库名。(若将生成的库移动到标准库lib内则无需加 -L表示路径)或者 gcc -shared -fPIC -o libfoo.so add.c max.c。使用静态库:1.先在文件里引用库 #include"foo.h"( -l后面跟库名)生成静态库:1.先生成 .o 文件。生成共享库:1.先生成 .o 文件。
2025-02-23 16:53:02
223
原创 Ubuntu笔记 - gdb调试
bg +%任务号 把挂起的进程唤醒到后台执行。-- kill -9 + pid 强制结束。-以下为一些单进程,单线程的基础调试命令。-在gdb下对main文件进行调试。ctrl + c 结束当前终端中在。-先生成文件的Debug版本。-ps 显示当前终端中的进程。(一些展示详细信息的命令)ctrl + z 停止运行。(后台运行的程序后缀 &)运行或者挂起的程序挪到。-结束进程的一些方式。jobs -l 查看。fg +%任务号 把。
2025-02-23 15:30:48
232
原创 Ubuntu笔记
(或者 gcc -c main.c -o main.o --- 生成 .o 文件)(1)gcc -c 使用到的 .c 文件 --- 分别生成各文件对应的 .o 文件。预编译 gcc -E main.c -o main.i --- 生成 .i 文件。编译 gcc -S main.i -o main.s --- 生成 .s 文件。汇编 gcc -c main.s -o main.o --- 生成 .o 文件。./文件名 --- 运行程序。
2025-02-12 23:18:52
263
原创 Ubuntu小白笔记(1.20)
若文件内容多于一屏可显示的数量,则可分屏显示文件内容 more main.c。grep -c hello main.c 统计文件中含有hello的行数。grep -v hello main.c 显示文件中没有hello的行。在文件中过滤指定字符串的行 grep "指定字符串" main.c。查看文件内容,会在新的界面上显示文件内容 less main.c。2>合并文件 cat a.txt b.txt > c.txt。统计文件中字符个数 wc -c main.c。1>查看文件内容 cat main.c。
2025-01-21 00:08:26
233
原创 Ubuntu Learning notes
(. 当前位置 ..返回上一层位置 -在最近的两个位置间切换 ~直接回到家目录)-(表示文件类型)rw-(属主权限) rw-(同组人权限) r--(其他人权限)r 读(4) w 写(2) x 执行(1) - 没有权限(0))拷贝目录文件 cp -r 路径+源文件名 新路径+文件名。mv a.c mydir 将a.c移入mydir目录中)(mv a.c b.c 将a.c的名字改为b.c。(ls -l(列出文件的详细信息)(删除普通文件 rm main.c。
2025-01-17 22:51:37
206
原创 C语言冒泡排序
在编程过程中我们不应该凭自身模糊的记忆或感觉随意书写部分功能,我们应时刻搞清楚自己的思路,冷静分析,避免走入盲目自信的误区。2.为一个很容易和冒泡排序混淆的排序方法,应注意两者内层循环的区别。在区分两者区别的过程中,我深深地感受到了编程思维的严谨性。下图中1.为冒泡排序代码,符合最常见的冒泡排序动画。
2024-11-07 19:21:05
213
原创 C语言基于ascill码的数字和英文字母的转换
'char 类型的大写字母' - 97 可得到 int 类型的数字(为从-32 开始到-7的负数)'char 类型的小写字母' - 97 可得到 int 类型的数字 (为从0开始到25的正数)int 类型的数字 + 'A' 可得到 char 类型的大写字母。int 类型的数字 + 'a' 可得到 char 类型的小写字母。
2024-09-24 17:32:06
772
1
空空如也
C语言冒泡排序内循环判断条件
2024-10-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅