自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何检测内存泄漏

宏定义,并且把自己的函数函数命名为nMalloc和nFree。编译运行,没有段错误。所以通过宏定义能用自己的malloc和free,而不去使用系统的。如果要知道p1p2p3返回的是什么,可以打印地址。但这个情况不太对,返回的不是可以指向的地址。改写nMalloc,把指向内存的指针返回回来。编译运行,内存就对了。这里发现p2写成p1笔误了,但懒得改了,第二个地址应该是p2。😅注意:宏定义在预编译时要展开,所以这两个宏定义放在nMalloc和nFree之上不可行。

2025-04-06 13:17:01 787

原创 内存高级话题

new Anew A()面试凉经,代码最近写的太少了,被面试官屠杀。痛定思痛,对中的内存话题进行复现。new A。

2025-03-20 20:55:41 889

原创 高并发内存池的thread cache部分实现及测试

并发内存池的框架介绍及线程缓存的实现和测试

2025-02-25 22:51:15 805

原创 线程局部存储及thread_local说明符

线程局部存储是指对象内存在线程开始后分配,线程结束后回收;且每个线程都有该对象自己的实例。线程本身是操作系统的概念,线程局部存储这个功能离不开操作系统支持。不同操作系统对线程局部存储的实现有不同,使用的系统API也有区别。

2025-02-25 19:59:21 371

原创 定长内存池的实现、测试及错误分析

定长内存池解决固定大小的内存申请释放需求, 性能达到极致,不考虑内存碎片等问题。并且它到在项目中也是一个组件。

2025-02-24 22:37:17 914

原创 工厂模式简介

由工厂对象通过类型决定创建出来产品类的实例。通过参数控制可以生产任何商品。简单工厂模式下新增多个工厂,多个产品,每个产品对应一个工厂。将相关产品组成产品族,由同一个工厂统一生产。将工厂抽象成两层,抽象工厂具体工厂子类,在工厂子类中生产不同类型的子产品。

2025-02-06 17:49:10 307

原创 设计模式六大原则和单例模式

实现可重用解决方案,构筑易维护、可扩展的软件系统。

2025-02-06 17:40:54 635

原创 C++17新特性:支持初始化语句的if和switch

控制结构可以在执行条件前先执行初始化语句。是一个初始化语句,初始化语句中声明的变量。声明一个数组,并将数组作为实参传入。条件语句之前也可以初始化语句.初始化语句声明的变量会贯穿整个。结构,可以利用这个特性给整个。的初始化语句中可以构造一个。

2025-02-06 17:33:36 184

原创 C++17新特性:结构化绑定

获取上述条件不难,只要为目标类型提供。

2025-02-06 17:26:04 746

原创 职责链模式

避免将请求发送者和接收者耦合在一起,让多个对象都有机会接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。处理请求的对象组成一条链(职责链),职责链可以是直线、环、树形结构。请求按职责链传递,链上的处理者对请求进行相应处理。客户端无需关心请求的处理细节及请求的传递,只需要将请求发送到链上。

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

原创 vscode通过ssh远程登陆Ubuntu

【代码】vscode通过ssh远程登陆Ubuntu。

2024-09-05 19:57:09 659

原创 函数调用运算符与function类模板(C++新经典笔记)

【代码】函数调用运算符与function类模板(C++新经典笔记)

2024-09-04 15:49:12 414

原创 比较函数指针、函数符、lambda函数

三种方法给STL算法传递信息:函数指针、仿函数、lambda。

2024-07-30 14:04:29 194

空空如也

空空如也

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

TA关注的人

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