- 博客(28)
- 收藏
- 关注
原创 如何检测内存泄漏
宏定义,并且把自己的函数函数命名为nMalloc和nFree。编译运行,没有段错误。所以通过宏定义能用自己的malloc和free,而不去使用系统的。如果要知道p1p2p3返回的是什么,可以打印地址。但这个情况不太对,返回的不是可以指向的地址。改写nMalloc,把指向内存的指针返回回来。编译运行,内存就对了。这里发现p2写成p1笔误了,但懒得改了,第二个地址应该是p2。😅注意:宏定义在预编译时要展开,所以这两个宏定义放在nMalloc和nFree之上不可行。
2025-04-06 13:17:01
787
原创 线程局部存储及thread_local说明符
线程局部存储是指对象内存在线程开始后分配,线程结束后回收;且每个线程都有该对象自己的实例。线程本身是操作系统的概念,线程局部存储这个功能离不开操作系统支持。不同操作系统对线程局部存储的实现有不同,使用的系统API也有区别。
2025-02-25 19:59:21
371
原创 工厂模式简介
由工厂对象通过类型决定创建出来产品类的实例。通过参数控制可以生产任何商品。简单工厂模式下新增多个工厂,多个产品,每个产品对应一个工厂。将相关产品组成产品族,由同一个工厂统一生产。将工厂抽象成两层,抽象工厂具体工厂子类,在工厂子类中生产不同类型的子产品。
2025-02-06 17:49:10
307
原创 C++17新特性:支持初始化语句的if和switch
控制结构可以在执行条件前先执行初始化语句。是一个初始化语句,初始化语句中声明的变量。声明一个数组,并将数组作为实参传入。条件语句之前也可以初始化语句.初始化语句声明的变量会贯穿整个。结构,可以利用这个特性给整个。的初始化语句中可以构造一个。
2025-02-06 17:33:36
184
原创 职责链模式
避免将请求发送者和接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。处理请求的对象组成一条链(职责链),职责链可以是直线、环、树形结构。请求按职责链传递,链上的处理者对请求进行相应处理。客户端无需关心请求的处理细节及请求的传递,只需要将请求发送到链上。
2025-02-06 17:06:22
391
原创 C++RAII用法
有一个简单的服务器例子。在Windows系统上写一个C++程序,在客户端请求连接时,给客户端发一条消息,然后关闭连接。不需要保证客户端一定能收到。
2025-02-06 16:54:24
367
原创 DHCP协议原理(网络协议)
DHCP(动态主机配置协议)是一种网络管理协议,能够自动为局域网中的每台计算机分配IP地址及其他网络配置参数,包括子网掩码默认网关和DNS服务器等。这一机制极大简化了网络管理,尤其在大型局域网中,管理员无需手动为每台计算机配置TCP/IP协议,从而节省了时间并减少了因IP地址重复导致的网络问题。子网掩码是一种用于区分网络部分和主机部分的32位数字,通常以四个十进制数表示(例如:255.255.255.0)。它在IP地址中扮演重要角色,帮助网络设备识别哪些设备位于同一子网内。默认网关。
2024-09-20 10:28:36
1735
原创 select系统调用(实现I/O复用)
假设FD_SETSIZE是1024,且unsigned long是 8 字节,则8*sizeof(unsigned long)=64,1024/64=16,这意味着fd_set中需要16个unsigned long来表示 1024 个文件描述符的状态。对端调用了关闭操作,本端socket仍然可读,但读取的数据量为 0,表示连接已经正常关闭,而没有任何剩余数据可供读取。一个常量,定义了fd_set能容纳的最大文件描述符的数量,这限制了select能同时处理的文件描述符总量。异常条件通常包括紧急数据等。
2024-09-18 22:56:13
1053
原创 远程连接MySQL并操作
确认mysql.h是否已经正确安装。通常,mysql.h会位于/usr/include/mysql/目录下。如果你使用的是基于Debian的系统(如Ubuntu),可以在终端通过如下步骤安装MySQL开发包。以下两图为运行mysql.cpp前后的数据库数据,可以看到tbl_user成功插入了一条数据。在编译时,确保编译器能找到mysql.h文件。可以通过-I标志指定头文件路径。运行以下命令以确保你拥有最新的软件包列表。执行以下命令以安装MySQL客户端开发包。
2024-09-17 17:18:35
1870
原创 VSCode扩展连接虚拟机MySQL数据库
可以尝试查看数据库中当前的用户列表,判断该用户是否有效。若用户无权限,就需要创建新用户并授权,然后刷新权限。此时可确认用户名和密码是有效的,并且具有访问权限。在MySQL中,运行以下SQL查询,查看MySQL的使用端口。在vscode中打开终端,输入以下命令并输入密码,尝试用。说明用户名和密码有效,可以用这个用户名登录SQL。在终端输入以下命令 ,输入密码后,进入MySQL。在MySQL中,运行以下命令,查看主机名。可以看到,端口配置和默认一样,是3306。在终端中,运行以下命令,查看IP地址。
2024-09-17 13:38:05
1568
原创 TCP并发服务器的实现
打开三个网络调试助手(NetAssist),在每个助手中配置远端主机地址为你的tcp服务器地址(在虚拟机用ifconfig查看),端口设置为 8888,点击连接。首先启动所写的tcp服务器,即确保tcp_server_test.cpp已经编译并运行在虚拟机上,监听指定的端口(8888)。epoll采用事件驱动的方式,仅在有事件发生时通知应用程序,避免了轮询带来的性能开销。支持边缘触发(EPOLLET),在数据到达时通知一次,适合需要高效处理大量事件的场景。能够处理大量的文件描述符,适合高并发应用。
2024-09-16 23:03:03
937
原创 DNS协议与请求的代码实现
/ 定义DNS服务器的IP地址// 定义DNS服务器的端口号// 定义DNS查询类型:主机记录(A记录)// 定义DNS查询类型:别名记录(CNAME记录)// 标识符,用于匹配请求和响应// 标志字段,包含查询类型、响应状态等信息// 查询问题数量(即“问题区域”中的记录数)// 回答数量(即“回答区域”中的记录数)// 权威名称服务器数量(即“授权区域”中的记录数)// 附加记录数量(即“附加区域”中的记录数)
2024-09-16 15:07:19
1137
原创 socket相关API(Linux网络编程基础API)
如果套接字sockfd的类型是SOCK_DGRAM,则addr是默认用于发送数据报的地址,并且是接收数据报的唯一地址。如果套接字的类型是SOCK_STREAM或SOCK_SEQPACKET,此调用尝试连接到绑定到addr指定地址的套接字。如果在队列已满时到达了连接请求,客户端可能会收到ECONNREFUSED错误,或者如果底层协议支持重传,请求可能会被忽略,从而在之后的重试中成功连接。一个指向socklen_t类型的变量的指针,传入时指示addr缓冲区的大小,返回时更新为实际地址长度。
2024-09-15 17:01:00
970
原创 socket地址API(Linux网络编程基础API)
指向一个缓冲区的指针,用于存储转换后的二进制格式的IP地址。转换后的in_addr_t类型的地址(网络字节序)。用于将一个IPv4地址的字符串表示形式转换为网络字节序的二进制格式,并将结果存储在struct in_addr结构体中。:指向struct in_addr结构体的指针,用于存储转换后的二进制地址。地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。地址族,指定要转换的IP地址类型,如AF_INET,AF_INET6。指向一个字符数组的指针,用于存储转换后的文本格式的IP地址。
2024-09-14 15:28:01
1405
原创 红黑树的插入(NGINX源码)
红黑树是每个节点都带有颜色属性的二叉查找树。它是一种自平衡的二叉查找树,能够在插入和删除数据时通过特定操作保持二叉查找树的平衡性,从而获得较高的查找性能。节点颜色:每个节点要么是红色,要么是黑色。根节点:根节点必须是黑色。叶节点:所有叶节点都是黑色。红色节点的子节点:红色节点的子节点必须是黑色(即不能有两个连续的红色节点)。每个节点的黑高:从任何节点到其所有后代叶节点的路径上,必须包含相同数量的黑色节点。
2024-09-13 21:42:48
1020
原创 文件操作函数
如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸,从原来的文件末尾到fseek移动之后的读写位置之间的字节都是0。系统对于每个打开的文件都记录着当前读写位置,当文件打开时,读写位置在文件开头,每调用一次fgetc,读写位置向后移动一个字节,因此可以连续多次调用fgetc函数依次读取多个字节。需要注意的是,返回的字符串是静态的,因此每次调用strerror都会覆盖之前的内容。直接在文件中读写结构体的程序是不可移植的,因为不同平台的大小端可能不同,结构体的填充方式也可能不同。
2024-09-12 08:40:31
812
原创 预处理笔记
预处理令牌(Token)是指预处理器在处理源代码时识别的基本单元。预处理令牌用于执行宏替换、条件编译和文件包含等操作。预处理令牌的主要类型包括:标识符(变量名、函数名)、关键字(#define、#include)、常量、运算符、分隔符。宏定义名可以像变量一样在代码中使用。宏定义名可以像函数一样在代码中使用。int j = 10;return 0;函数式宏定义的参数没有类型,预处理器只负责进行形式上的替换,而不做参数类型检查。
2024-09-10 20:06:35
1282
原创 线程的结束(Linux C/C++笔记)
线程就被动结束,一种方法是可以在同进程的另外一个线程中通过函数pthread_kill发送信号给要结束的线程,目标线程收到信号后再退出;只能只能按快捷键Ctrl+C来停止进程,这说明在主线程中虽然发送取消请求了,但并没有让子线程停止运行,因为如果停止运行,pthread_join是会返回并打印其后面的语句的。如果不用pthread_testcancel,则可以在while循环中用sleep函数来代替,但这样会影响while的速度,在实际开发中,可以根据具体项目具体分析。thread:需要取消的线程的ID。
2024-09-09 13:28:31
982
原创 线程的属性(Linux C/C++笔记)
线程的属性有:分离状态、调度策略和参数、作用域、栈尺寸、栈地址、优先级。char __size[__SIZEOF_PTHREAD_ATTR_T]字符数组,大小为__SIZEOF_PTHREAD_ATTR_T,用于存储属性值对齐成员,确保结构体的对齐方式符合要求用于获取线程thread的属性,并将这些属性存储在attr指向的pthread_attr_t结构体中,当获得的属性结构体变量不再需要的时候,应该用函数pthread_attr_destroy进行销毁。使用该函数需要定义宏#define
2024-09-08 15:11:57
1091
原创 线程的创建(LinuxC/C++笔记)
sleep只能等待固定的时间,在这个时间内,有可能子线程早就结束了,也有可能子线程没有完成,用sleep等待子线程结束并不精确。指向pthread_attr_t类型的常量指针,用于指定线程属性(线程的栈大小、调度策略)。函数指针,指向线程函数的地址。线程函数是函数创建后要执行的函数,返回void*类型的指针,参数为void*类型的指针。指向void的指针,传递给线程函数的参数。接收线程的返回值,*value_ptr指向该返回值。指向pthread_t类型的指针,指向创建成功后的线程ID。
2024-09-07 16:14:49
637
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人