- 博客(78)
- 收藏
- 关注
原创 【C++】智能指针的底层原理与使用场景
现象:use_count始终≥1,资源永不释放。解决:将其中一个指针改为weak_ptr。:以下代码输出什么?管理跨线程缓存数据,通过。
2025-02-22 13:45:34
340
原创 【C++】模板元编程原理与应用
(Template Metaprogramming, TMP)是。的技术,本质是将运行时逻辑迁移到编译期完成。:如何用模板元编程实现编译期判断素数?
2025-02-22 13:31:43
426
原创 【C++】static关键字的用法和底层原理
静态函数无this指针,无法访问对象成员(需通过对象指针/引用间接访问)。static关键字在C++中根据上下文有四大核心作用,是静态成员变量,因此这个赋值操作会影响到所有的。首次执行时在站外分配,生命周期与程序相同。位于全局/静态存储区.data或.bss。:以下代码输出什么?
2025-02-22 12:59:05
362
原创 【C++】面向对象的三大特性
封装:通过隐藏实现细节和暴露接口来保护数据,确保对象的内部状态不被随意修改。继承:子类可以继承父类的属性和方法,复用代码并扩展功能。多态:同一接口可以根据不同对象表现出不同的行为,提高了代码的灵活性和扩展性。
2025-02-20 19:20:16
394
原创 【C++八股】智能指针
当引用计数为零时,自动删除所指向的对象。std::unique_ptr 是一种独立智能指针,独占内存资源,不能被其他独立智能指针共享,拥有自动释放内存的功能。旨在管理动态分配对象的生命周期,支持多个指针共享同一对象的所有权。实例指向同一个对象,当引用计数降为零时,自动释放所管理的对象,从而有效防止内存泄漏。智能指针⽤于管理动态内存的对象,其主要⽬的是在避免内存泄漏和多次释放资源。时,会同时分配对象和控制块的内存,避免了多次内存分配,提高了性能。被销毁时,它所管理的对象也会被自动销毁,从而有效防止内存泄漏。
2025-02-13 21:48:41
369
2
原创 【C++八股】内存泄漏
内存泄漏(Memory Leak)是指程序在动态分配内存后,未能及时释放已分配的内存,导致这些内存无法被再次使用,从而造成系统内存的浪费。当基类指针指向子类对象时,如果基类的析构函数不是virtual,那么子类的析构函数将不会被调用,子类的资源没有正确释放,就会造成内存泄漏。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使⽤,就会产⽣ Heap Leak.包括:共享指针,独占指针,弱指针。等没有使⽤相应的函数释放掉,导致系统资源的浪 费,严重刻可导致系统效能降低,系统运行不稳定。
2025-02-13 21:40:19
190
原创 【C++八股】C++内存管理
2.堆 :堆用于存储动态分配的内存的区域,由程序员手动分配和释放。使用 new 和 delete 或 mal1oc 和 free 来进行堆内存的分配和释放。1.栈 :栈用于存储函数的局部变量、函数参数和函数调用信息的区域。栈上的内存分配和释放是⾃动的,速度较快。栈上的变量生命周期与其所在函数的执行周期相同,而堆上的变量生命周期由程序员显式控制。堆是一种动态分配的内存区域,⽤于存储程序运⾏时动态分配的数据。栈是⼀种有限的内存区域,⽤于存储局部变量,函数调用信息等。栈和堆都是⽤于存储程序数据的内存区域。
2025-02-12 22:40:12
243
原创 【C++八股】struct和Class的区别
2. 默认继承控制 struct:结构体的继承默认是 ,即基类的成员默认以公有方式继承给派生类。 class:类的继承默认是 ,即基类的成员默认以私有方式继承给派生类。3. 面向对象特性 struct:结构体通常用于简单的数据存储,不具备类中的丰富的封装、继承和多态等特性。 class:类是C++中的核心面向对象特性,支持封装、继承和多态等特性。总结
2025-02-11 22:29:13
221
原创 【C++八股】什么是函数指针,如何定义和使⽤场景
函数指针的定义与普通指针稍有不同。它需要声明指向特定类型函数的指针。基本格式返回类型 (*指针名称)(参数类型);//定义指向该函数的指针:int是函数返回的类型。是指针变量的声明。(int, int)是该函数的参数类型。函数指针的关键点。
2025-02-11 22:19:18
395
原创 【C++八股】std::atomic —— 原子操作
是 C++11 引入的模板类,主要用于多线程编程中的原子操作,确保在多个线程访问或修改共享变量时不会产生数据竞争。在多线程环境下,普通变量的操作不是原子的,可能被多个线程同时访问和修改,导致数据竞争。示例(非原子操作可能导致错误):这里 不是原子操作,两个线程可能会同时读取 ,然后都执行 ,导致最终结果错误。解决方案:使用 ✅ 确保 的所有操作都是原子的,消除了数据竞争。✅ 适用于多线程环境,提供无锁原子操作,避免数据竞争。✅ 比 更高效,但只适用于简单变量(int、指针等)。✅
2025-02-09 20:55:37
529
1
原创 【C++八股】volatile/extern/static
在 C++ 里,volatile关键字用于告诉编译器,确保,而不是使用寄存器缓存的值。1.volatile。
2025-02-09 20:25:02
332
原创 【C++八股】constexpr 和 const 区别
在 C++ 中,constexpr和const都用于,但两者的作用和适用场景不同,尤其在方面存在本质区别。const✅:表示变量是,不能被修改。✅const可能是运行期变量✅const变量在编译时确定,它可能依赖运行时计算。constexpr✅:表示变量、函数、对象的值。✅constexpr变量(必须是编译时常量)✅constexpr变量,不能依赖运行时计算。(2)constexpr函数✅constexpr函数如果,则;如果传入,则。
2025-02-08 16:05:58
411
原创 【C++八股】new 和 malloc 的区别
在 C++ 中,new和malloc都可以用来malloc✅:在分配一块,返回void*指针。✅:调用malloc()进行。✅void*free()✅ageStudent*new✅:在分配一块,返回。✅:调用new,不仅分配内存,还会进行初始化。
2025-02-08 15:58:54
549
原创 【C++八股】static关键字
用于修改变量、函数、类成员的存储方式和作用域。面试中常考 的作用、使用场景、与普通变量的区别。作用:局部变量的生命周期变为整个程序运行期间,但作用域仍然在当前函数内。✅ 特点:✅ 应用场景:计数器、状态保持等。✅ 作用:限制全局变量的作用域,使其只能在当前文件内访问。1)普通全局变量(作用域跨文件)(2) 修饰全局变量(作用域仅限当前文件)✅ 总结:✅ 应用场景:防止变量污染,避免多个文件中的变量重名。(1)普通函数(可跨文件调用)(2) 修饰函数(作用域仅限当前文件)✅ 总
2025-02-08 15:33:45
631
原创 【C++八股】const 关键字
关键字用于定义常量,防止变量被修改,增强代码安全性和可读性。面试中常考 在变量、指针、函数等场景的使用。2. 修饰指针 口诀: 在 前修饰值,在 后修饰指针。3. 修饰函数参数✅ 防止参数在函数内部被修改,提高代码安全性。✅ 优点:避免拷贝,提高效率。(1) 修饰值传递2) 修饰指针(3) 修饰引用(常用)4. 修饰函数返回值(1) 修饰返回值(防止修改返回值)(2) 修饰成员函数✅ 面试重点: 成员函数不能修改成员变量!
2025-02-08 15:23:28
552
原创 【C++八股】整型 short int long 和 long long
整型(Integer)主要包括shortintlong和long long,它们的区别主要在于和,这些通常依赖于编译器和操作系统。
2025-02-08 15:13:21
450
原创 【网络编程】多进程服务器端
换言之,如果父进程未主动要求获得子进程的结束状态值,操作系统将一直保存,并让子进程长时间处于僵尸进程状态。向exit函数传递的参数值和main函数的retum语句返回的值都会传递给操作系统。进程完成工作后(执行完mian函数)应被销毁,但有时这些进程将编程僵尸进程,占用系统中重要资源。父进程和子进程一样繁忙,不能只调用waitpid函数等待子进程终止。也就是说,将子进程变成僵尸进程的正是操作系统。,进程发现自己的子进程结束时,请求操作系统调用特定函数。父进程fork函数返回子进程ID,子进程返回0。
2024-06-15 14:52:34
440
原创 【网络编程】套接字的多种可选项
可以看出,套接字可选项是分层的。IPPROTOIP层可选项是IP协议相关事项IPPROTO TCP层可选项是TCP协议相关的事项,SOLSOCKET层是套接字相关的通用可选项。
2024-06-14 16:36:57
992
原创 【网络编程】域名及网络地址
DNS(Domain Name System,域名系统),是对IP地址和域名进行互相转换的系统,其核心是DNS服务器。域名:提供网络服务的服务器端也是通过IP地址去份额,但IP地址难记,因此将容易记、易表述的域名分配并取代IP地址。DNS服务器:用IP地址、或域名进入网页,接入过程不同。域名是默认DNS赋予服务器的虚拟地址,非实际地址。DNS可以将虚拟地址转化为实际地址。一般不会轻易改变服务器域名,但会相对频繁地改变服务器 IP 地址。
2024-06-14 15:58:31
372
原创 【网络编程】优雅断开套接字连接
Linux的close函数和Windows的closesocket函数意味着完全断开连接。完全断开不仅指无法传输数据,而且也不能接收数据。2台主机正在进行双向通信,主机A发送完最后的数据后,调用close函数断开了连接,之后主机A无法再接收主机B传输的数据。实际上,是完全无法调用与接收数据相关的函数。
2024-06-14 15:36:19
316
原创 【网络编程】基于UDP的服务器端/客户端
UDP可看作是信件邮寄,邮寄过程可能会信件丢失,是一种不可靠的数据传输服务。但UDP性能更高,实现更加简洁。流控制是区分UDP和TCP的最重要标志。IP的作用就是让离开主机B的UDP数据包传递给主机B,UDP根据端口号将传到主机的数据包交付给最终的UDP套接字。
2024-06-13 21:42:55
872
原创 【网络编程】TCP原理
TCP套接字中的I/O缓冲write函数调用后并非立即传输数据,read函数调用后也非马上接收数据。write函数调用瞬间,数据将移至输出缓冲;read函数调用瞬间,从缓冲读取数据。这些IO缓冲特性可整理如下。TCP会控制数据流,不会因为缓冲溢出而丢失数据。对方套接字建立连接的过程。连接过程中套接字之间的对话如下。
2024-06-13 17:20:00
511
原创 【网络编程】基于TCP的服务器端/客户端
链路层链路层是物理连接领域标准化的结果,是最基本的领域,专门定义LAN,WAN,MAN等网络标准。IP层选择传输数据的路径。IP是面向消息的、不可靠的协议。每次传输数据会帮选择一条路径,但并不一致,若发送路径错误则选择其他路径;若发送数据丢失或错误则无法解决。IP协议无法应对数据错误。TCP/UDP层TCP和UDP层以IP层提供的路径信息为基础完成实际的数据传输,故该层又称为传输层。IP层只关注一个数据包的传输过程。
2024-06-12 21:27:22
2391
3
原创 【网络编程】地址族与数据序列
IP是Internet Protocol简写,是为了收发网络数据而分配给计算机的值,端口号是为区分程序中创建的套接字而分配给套接字的序号。网络地址分为两类:IPv4(4个字节地址族),IPv6(6个字节地址族)向套接字分配网络地址,bind函数负责。
2024-06-12 16:43:31
256
原创 【网络编程】套接字类型与协议设置
收发数据的套接字内部有缓冲(buffer),即字节数组。通过套接字传输的数据将保存到该数组。因此,收到数据不意味着马上调用read函数。只要数组不超过数组容量,则可能在数据填充满缓存后通过1次read函数读取全部,也可能分多次读取。因此,面向连接的套接字不存在数据边界。传输数据的计算机通过3次调用write函数传递100字节数据,但接收数据计算机只通过1次read函数调用就接收全部的100个字节。协议:计算机对话的通信规则,简而言之是为了完成数据交换而定好的约定。按序传输数据,传输的数据不存在数据边界。
2024-06-12 16:23:47
220
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人