编程宝典
文章平均质量分 88
张小方32
这个作者很懒,什么都没留下…
展开
-
13.纤程(Fiber)与协程(Coroutine)
13.1 纤程纤程(Fiber)是 Windows 操作系统提供的概念。什么是纤程呢?当我们需要异步执行一些任务时,常用的一种做法就是开启一个工作线程,在工作线程中执行我们的任务。但是这样存在两个问题:由于线程的调度是操作系统内核控制的,我们没法准确地确定操作系统何时会运行或挂起该线程; 对于一些轻量级的任务,创建一个新的线程去做,消耗比较大,我们不希望有这种消耗。那么有没有一种机制,既能起到新建线程执行任务,又没有新建线程消耗那么大呢?有,这就是纤程。在 Windows 中一个线程中可原创 2023-12-10 14:39:27 · 1192 阅读 · 0 评论 -
12.线程池与队列系统的设计
不过是一组线程而已,一般情况下,我们需要异步执行一些任务,这些任务的产生和执行是存在于我们程序的整个生命周期的,与其让操作系统频繁地为我们创建和销毁线程,我们通常需要创建一组在我们程序生命周期内不会退出的线程,为了不浪费系统资源,我们的基本要求是当有任务需要执行时,这些线程可以自动拿到任务去执行,没有任务时这些线程处于阻塞或者睡眠状态。当然,技术上除了要解决线程池的创建、往队列中投递任务、从队列中取任务处理,我们还需要做一些善后工作,如线程池的清理,即如何退出线程池中的工作线程和清理任务队列。原创 2023-12-10 14:37:02 · 1066 阅读 · 0 评论 -
11.C库的非线程安全函数
结构体指针类型,而我们外部并不需要释放这个指针指向的内存,因此我们断定这个函数内部一定使用了一个全局变量或函数内部的静态变量。这样的话,当再次调用这个函数时有可能前一次调用结果就被后一个结果覆盖了。是因为最初编写很多 CRT 函数时,还没有多线程技术,所以很多函数内部实现都使用了函数内部的静态变量和全局变量。随着多线程技术的出现,很多函数出现了对应的多线程安全版本,如。因此我们在实际开发中应避免在多线程程序中使用这类函数,这类函数还有如。这类 CRT 提供的具有上述行为的函数,我们称为。原创 2023-12-10 14:29:19 · 350 阅读 · 0 评论 -
10.线程局部存储
对于一个存在多个线程的进程来说,有时候我们需要有一份数据是每个线程都拥有一份的,也就是说每个线程自己操作自己的这份数据,这有点类似 C++ 类的实例属性,每个实例对象操作的都是自己的属性。我们把这样的数据称之为。上述程序一共创建 5 个线程,每个线程都会自己生成一个日志文件,每个线程将自己的日志写入自己的文件中,当线程执行结束时,会关闭打开的日志文件句柄。是一个线程局部变量,因此该进程中每一个线程都会拥有这样一个变量副本,由于是不同的副本,)数据,因为进程中的所有线程都可以使用返回的键,所以参数。原创 2023-12-10 14:24:05 · 911 阅读 · 0 评论 -
09.多线程使用锁实践经验总结
前面也说过,这种逻辑非常容易因为疏忽忘记在某个地方加上解锁代码而造成死锁,所以一般建议使用 RAII 技术将加锁和解锁代码封装起来,也就是说,我们可以定义一个锁对象包装类,其成员变量含有一个锁对象,在该包装类的构造函数中对锁对象进行加锁,在析构函数中对锁对象进行解锁,这样在函数出口处,锁对象包装类由于出了作用域被析构进而对其锁对象进行解锁。所谓减小锁使用粒度指的是尽量减小锁作用的临界区代码范围,临界区的代码范围越小,多个线程排队进入临界区的时间就会越短。请求锁,以免出现“活锁”现象,这是对资源的一种浪费。原创 2023-12-10 14:21:34 · 767 阅读 · 0 评论 -
08.如何确保创建的线程一定运行起来?
不知道读者注意到没有,我在介绍上述说的确保线程一定运行起来的做法时使用了两个词——“古老”和“严谨”,“严谨”不用多介绍,之所以说“古老”是因为你现在在各种新型的项目中基本上再也看不到这种确保线程运行起来的做法了,许多年以前多线程编程开始流行起来的时候,那时由于软硬件的水平限制,加之很多开发人员对多线程编程技术的不熟悉,创建新线程时确保一个线程跑起来非常必要;基于以上思路,我们创建一组线程时,可以一个一个地创建,每成功运行一个新线程再创建下一个,确保线程组中的每一个线程都可以运行起来。原创 2023-12-10 14:20:10 · 322 阅读 · 0 评论 -
07.C++11/14/17线程同步对象
C++ 11 标准让很多开发者诟病的原因之一是,C++ 新标准借鉴 boost 库的 boost::mutex、boost::shared_mutex 而引入 std::mutex 和 std::shared_mutex,但是在 C++11 中只引入了 std::mutex,直到 C++ 17 才有 std::shared_mutex,这让只能使用仅支持 C++11 标准的编译器(例如 Visual Studio 2013,gcc/g++ 4.8)的开发者非常不方便。原创 2023-12-10 14:19:13 · 838 阅读 · 0 评论 -
06.Windows线程资源同步对象
需要说明的是,临界区对象通过保护一段代码不被多个线程同时执行,进而来保证多个线程之间读写一个对象是安全的。也就是说,当其中一个线程离开临界区,即使此时有其他线程在这个临界区外面等待,由于线程调度的不确定性,此时正在等待的线程也不会有先进入临界区的优势,它和刚离开这个临界区的线程再次竞争进入临界区是机会均等的。当然,在实际开发中这种方式是靠不住的,线程调度是操作系统内核的策略,应用层上的应用不应该假设线程的调度策略是按预想的来执行,但是理解线程与临界区之间的原理有助于你编写出更高效的代码来。原创 2023-12-10 14:16:53 · 866 阅读 · 0 评论 -
05.Linux线程同步对象
某个线程A在条件不满足的情况下,主动让出互斥体,让其他线程去折腾,线程在此处等待,等待条件的满足;线程A之所以可以安心等待,依赖的是其他线程的协作,它确信会有一个线程在发现条件满足以后,将向它发送信号,并且让出互斥体。因为某次操作系统唤醒pthread_cond_wait时tasks.empty()可能仍然为 true,言下之意就是操作系统可能会在一些情况下唤醒条件变量,也就是说存在没有其他线程向条件变量发送信号,但等待此条件 变量的线程也有可能会醒来的情形。的,因为多个线程会同时读写之。原创 2023-12-10 14:10:24 · 932 阅读 · 0 评论 -
04.整型变量的原子操作
因此,如果读者想利用C++11提供的std::atomic库编写跨平台的代码,在使用std::atomic提供的方法时建议参考官方std::atomic提供的接口说明来使用,而不是想当然地认为一个方法在此平台上可以运行,在另外一个平台也能有相同的行为,避免出现上面说的这种情形。在C++ 98/03标准中,如果想对整型变量进行原子操作,要么利用操作系统提供的相关原子操作API,要么利用对应操作系统提供的锁对象来对变量进行保护,无论是哪种方式,编写的代码都无法实现跨平台操作,例如上一小介绍的。原创 2023-12-10 14:07:58 · 893 阅读 · 0 评论 -
03.线程函数传C++类实例指针惯用法
对于实例方法,为了保证类方法的正常功能,C++编译器在翻译时,会将类的实例对象地址(也就是this指针)作为第一个参数传递给该方法,也就是说,翻译后的。综上所述,如果不使用C++11的语法,那么线程函数只能使用类的静态方法,且函数签名必须符合线程函数的签名要求。指针作为线程函数的唯一参数传入,这样在线程函数中,可以通过线程函数参数得到对象的指针,通过这个指针就可以自由访问类的实例方法了。类就没有这个限制,即使类成员函数是类的实例方法也可以,但是必须显式地将线程函数所属的类对象实例指针(在类的内部就是。原创 2023-12-10 14:03:50 · 819 阅读 · 0 评论 -
02.线程基本操作
在pstack输出的各个线程中,只要逐一对照我们的程序源码来梳理下该线程中是否有大多数时间都处于空转的逻辑,然后修改和优化这些逻辑就可以解决CPU使用率过高的问题了,一般情况下,不工作的线程应尽量使用锁对象让其挂起,而不是空转,这样可以提高系统资源利用率。获取的线程ID是系统范围内全局唯一的,一般是一个不会太大的整数,这个数字也是就是所谓的LWP (Light Weight Process,轻量级进程,早期的Linux系统的线程是通过进程来实现的,这种线程被称为轻量级进程)的ID。这里可以使用Linux。原创 2023-12-10 13:59:53 · 926 阅读 · 0 评论 -
01.线程的基本概念
但是就一个程序本身执行的操作来说,进程其实什么也不做(不执行任何进程代码),它只是提供一个大环境容器,在进程中实际的执行体是”一般来说,每个线程都是独立执行的单位,每个线程都有自己的上下文堆栈,一个线程的崩溃不会对其他线程造成影响。错误,这个错误会产生一个信号,操作系统默认对这个信号的处理就是结束进程,整个进程都被销毁了,这样的话这个进程中存在的其他线程自然也就不存在了。系统中,如果主线程退出,工作线程一般不会受到影响,还会继续运行下去,但是此时这个进程就会变成所谓的。,我们把这个线程称之为”原创 2023-12-10 13:55:55 · 812 阅读 · 0 评论 -
利用 CMake 生成 Visual Studio 工程文件
对于习惯了 Visual Studio 强大的管理项目、编码和调试功能的读者来说,在 Linux 下使用 gcc/g++ 编译、使用 gdb 调试是一件何其痛苦的事情,对于大多数的开源 C/C++ 项目,如果我们不在意 Windows 和 Linux 在一些底层 API 接口上的使用差别,想熟悉该项目的执行脉络和原理,在 Windows 上使用 Visual Studio 调试该项目也未尝不可。凡是可以使用 CMake 工具编译的 Linux 程序(即提供了。原创 2023-12-10 13:54:54 · 997 阅读 · 0 评论 -
如何学习 CMake
对于习惯了 Visual Studio 强大的管理项目、编码和调试功能的读者来说,在 Linux 下使用 gcc/g++ 编译、使用 gdb 调试是一件何其痛苦的事情,对于大多数的开源 C/C++ 项目,如果我们不在意 Windows 和 Linux 在一些底层 API 接口上的使用差别,想熟悉该项目的执行脉络和原理,在 Windows 上使用 Visual Studio 调试该项目也未尝不可。那么是不是意味着你必须学习 CMake 的方方面面,不是的,你只要掌握 CMake 常用语法和命令即可。原创 2023-12-10 13:39:32 · 932 阅读 · 0 评论 -
一款远程控制软件 —— pcshare
3. 生成一个新的宿主程序,这个程序的名称叫ps.exe,然后将ps.exe与PcStat.exe一起发给要被控制的机器上。在被控制的机器上启动PcStat.exe,过一会儿被控制端就连接上控制终端了,控制终端就可以对被控制终端进行各种控制了。控制端通过寄生在被控制端的后台程序来实现控制,可以对被控制台进行文件管理、屏幕监控、键盘监控、监控管理、查看被控制端的服务和注册表,甚至是控制被控制端的摄像头。1. 启动PcShare.exe,这是控制端主程序,该程序会在8080端口上监听被控制端的连接。原创 2023-12-09 23:34:19 · 376 阅读 · 0 评论 -
Linux epoll 源码分析.pdf
可以看看下面关于 epoll 模型的源码分析。原创 2023-12-09 23:16:40 · 328 阅读 · 0 评论 -
C++学习新书单 —— 第 1 篇
自从 C++11 强化了右值语义,引入了右值引用、移动构造函数和赋值移动函数以及 std::move 等方法,右值的语义被广泛地用于各种 C++ 项目,加上 stl 库常用类都支持了移动操作,用好右值语义能让你的程序节省大量内存、运行效率更高。如果你也对 C++ 右值语义感兴趣,并想利用右值写更好更快的 C++ 代码,不妨读一读,书的篇幅也不厚,读完花不了多长时间。我学习和使用 C/C++ 开发快 13 年了,目前在大厂做 C++ 开发,我整理了一套 C/C++ 优质学习资料————原创 2023-12-09 23:15:28 · 767 阅读 · 0 评论 -
如何在 Visual Studio 编译调试 Windows 版本的 Nginx 源码?
根据这个帮助文档,我们需要安装如下依赖环境:其中,Mercurial 不是必需的,我们可以根据官方给的这个链接,安装 Visual Studio 2022、MSYS2、Strawberry Perl,并下载三个依赖库,我们实际下载的三个文件名和版本号是:官网。原创 2023-12-09 23:04:30 · 982 阅读 · 0 评论 -
阅读开源项目的一些经验分享
必看 Nginx 经典书籍(含下载方式)mp.weixin.qq.com/s/Rgzzqvl9pik7zVzNX8n8PA编辑以上三种方式都是不错的阅读源码的方式,读者可以根据自己的水平、目的和所处阶段去使用。原创 2023-12-09 22:49:10 · 749 阅读 · 0 评论 -
C++中,i=1 是原子操作吗?
在正式回答这个问题之前,我给你讲一个我的故事。我刚开始参加工作的那年,公司安排我开发一款即时通讯软件(类似于 QQ、微信这种聊天软件),在这之前我心里也知道如果多线程操作一个整型值是要加锁的,但是当时为了图代码简便,而且在实际调试的时候,没有加锁的代码也从来没出过问题。于是我就心存侥幸了,觉得对多线程操作整型值加锁真是多此一举。我们的软件有类似于微信这种单人聊天功能,每个用户都使用一个整型的 userid,问题就出在这里。原创 2023-12-09 22:42:09 · 1021 阅读 · 0 评论 -
推荐一些好的编程习惯
例如,定义变量时尽量给一个有效的初始值,释放指针对象指向的资源时,尽量将指针设置为 NULL(对于 C/C++ 程序排查一个空指针问题远比排查野指针问题要容易得多),使用 RAII 技术保证资源在每条出口路径上都会被释放,多线程加锁时,尽量减小锁的粒度,加多个锁时,锁的方向一致,避免死锁等等。很多同学在遇到问题时,习惯上去百度等搜索引擎上去寻找答案,解决问题后,就直接过去了,下次遇到同样的问题,可能又去搜索引擎继续搜索,这样日复一日,功能做了一个又一个,技术毫无长进。目前就想到这么多,原创不易,请给。原创 2023-12-09 14:30:22 · 1112 阅读 · 0 评论 -
Go语言好找工作吗?
Golang 目前的岗位相比较 Java、C/C++ 等岗位来说,不算多,但也不算少,国内一些做云原生相关的公司大量招 Go 开发,例如字节跳动、七牛云、UCloud,腾讯和美团一些业务线也开始往 Go 迁移。我目前在字节跳动做 Go 开发,需要内推的可以私信我。原创 2023-12-09 14:21:02 · 887 阅读 · 0 评论 -
包装开源项目作为自己的项目,来字节面试,这位同学现场翻车了......
这里存在的问题是,在网络编程中,当我们有数据需要发送时可以直接发送,但是如果数据因为对端 TCP 窗口太小发不出去时,我们应该将数据缓存起来,并注册监听 socket 可写事件,在下一次可写事件触发时,我们接着发数据,一直到数据发完为止,这个库中缺少这样的逻辑,所以程序是不健壮的。函数,由于连接已经建立,所以在这个函数中读取数据,然后解析 http 请求报文,然后根据设置的 http 路由进行处理,在路由处理函数中组装 http 响应,然后将数据发出去,如果某个路由未设置,则走默认错误处理路由。原创 2023-12-09 13:41:09 · 921 阅读 · 0 评论 -
C++ 内存崩溃问题应该如何调试?
C++11(Modern C++)以及之后的版本提供的智能指针使用起来确实很方便,也建议你在实际的 C++ 的项目中多多使用,可以避免很多内存泄漏问题,但是前提是我们必须充分理解每一种智能指针的用法和注意事项,尤其是在和左值、右值、移动构造、std::move 、std::forward 等特性结合使用时,需要多加小心。原创 2023-12-09 13:31:05 · 824 阅读 · 0 评论 -
推荐一款比 Postman 好用 20 倍的开发工具
Eolink除了API管理、自动化测试服务以外,还是全球首个API全生命周期管理的SaaS平台,提供包括API网关、API监控、API自动生成等服务。截至目前,Eolink已经为包括奇安信、深信服、泰康集团、索尼、统一企业、博时基金、圆通速递等数千家各行业领先的企业提供API管理服务,实力非常硬,口碑非常好,值得信赖!Eolink支持定时测试任务,或者将 API 自动化测试平台集成到Jenkins上,实现代码提交即触发测试,实现项目在无人值守的情况下自动测试,解放劳动力。原创 2023-12-09 13:17:57 · 1111 阅读 · 0 评论 -
如何设计保活机制与心跳包
当我们的服务程序与客户端之间存在代理服务,后端服务与代理服务之间是长连接,代理服务与客户端之间也是长连接,且后端服务器的业务类型是订阅类型,也就是说客户端一旦订阅某个类型的主题后,就很少或者不再给服务器发送消息了,而后端服务不断将客户端订阅的特定主题数据下发给客户端(如股票交易中的行情服务),此时使用上文介绍的更新心跳包的最新时间使用服务器的上行数据或者下行数据的发包时间,就可能无法检测到客户端是否已经断开了。但是,如果通信的两端有频繁的数据来往,此时到了下一个发心跳包的时间点了,此时发送一个心跳包。原创 2023-12-09 13:11:09 · 770 阅读 · 0 评论 -
一套简单通用的Java后台管理系统,拿来即用,非常方便(附项目源码)
我推荐一套简单通用的后台管理系统,主要功能有:权限管理、菜单管理、用户管理,系统设置、实时日志,实时监控,API加密,以及登录用户修改密码、配置个性菜单等。原创 2023-12-09 13:03:34 · 851 阅读 · 0 评论 -
Github 17K!史上最强悍!阿里谷歌字节大厂「LeetCode 刷题手册」开放下载了!
一般对于校招和工作年限不长的同学,如果算法题答不好,基本会被一票否决,大厂的算法题其实也并不难,只要认真刷一些题一般都可以答出来。国内一线大厂的面试形式慢慢和国外巨头靠拢,对算法的要求是越来越高,特别是 LeetCode 的相关算法。但是目前国内有关刷算法题的优质内容比较少,导致有些朋友错失了去大厂的机缘,最近发现了一个优质的算法神器!进大厂是很多程序员的愿望,特别是对于刚毕业的程序员来讲,进了大厂之后的发展高度与不进大厂完全不一样。每一个章节先讲概念和框架,然后进行实战演练,这种方式真的是学习的好帮手!原创 2023-12-07 21:24:24 · 882 阅读 · 0 评论 -
程序员面试时,如何谈年终奖不吃亏?
反过来如果你离职的当月有长假,例如 10 月份,而你是在国庆长假后离职的,那么计算你离职当月的实际收入不会算上这法定七天假日的。这是很多公司套路,请假或离职扣薪资时算日薪按按。原创 2023-12-07 21:19:39 · 887 阅读 · 0 评论 -
进了小公司的应届程序员如何翻身进入大公司?
我 2018 年年底从携程旅行网离职与人合作创业,项目于 2019 年 8 月正式上线运营,8 月后到 12 月初系统针对之前的一些问题做了第二版的优化和重构。从 12 月初开始工作就不是太忙,于是更新了一下简历,出去面试一下保持自己对技术的敏感度(当然,如果有合适的职位也是可以考虑的)。我求职的职位是资深开发或者系统架构师级别,开发语言优先选 Java,其次是 C/C++。老的读者应该知道,我是 C/C++ 出身,后面由于工作需要开始做 Java,并且专门去携程历练了一段时间自己的 Java 技术。原创 2023-12-07 21:17:32 · 845 阅读 · 0 评论 -
非计算机专业如何转行计算机开发?
这个问题太适合我了[破涕为笑][破涕为笑][破涕为笑]我就是那个非计算机专业一心想转计算机专业,但是最终没转成,但是通过自学走上开发之路的,当年也是到处求书单。目前在某大厂做资深开发,发几张目前的工作环境照吧:转眼毕业七年多了,这是 2014 年毕业的时候,在纪念日,和女朋友(现在已经是老婆了)一起拍的照片:这是去年结婚 5 周年在新家拍的照片:好啦,如果你觉得挺好的。那我就继续和你讲一讲我的故事和你要的书单。我大学学的是地理科学专业,没错,这是一个师范专业,培养的目标是高中地理老师。隔壁计算机专业的课程一原创 2023-12-07 21:14:17 · 1095 阅读 · 0 评论 -
学习 Java,觉得自己很难成为高手,该怎么办?
我曾在携程旅行网做过 Java 技术专家,下面就作为 Java 面试官的角度来尝试回答一波。当然,核心的问题在于缺乏主动性和方向性,不知道接下来该补充什么,培训班与科班学的好的相比,本来就先失一着,如果接下来不知道失之东隅收之桑榆,那这条路基本很难走的长远。接下来,我将从和等四个方面来说一下学习方法,并推荐一些经典书籍,书不多,都是我自己买过实体书并读过的,具有可操作性。Java 并发编程首推《》:另外《》这一本也不错。推荐的书是《原创 2023-12-07 21:07:29 · 884 阅读 · 0 评论 -
大学四年、硕士三年、工作七年,我都读了哪些计算机经典书籍?
作为一名过来人的老学长,我码这么多字,希望想做好开发的学弟学妹们,勿在浮沙筑高台,一定多阅读经典计算机书籍去提高内功。原创 2023-12-06 21:52:00 · 968 阅读 · 0 评论 -
你什么时候开始觉得你的代码能力明显上升了一个档次?
后来,我去武汉光谷软件园找实习,人家直接丢给我一个完整的 MFC 程序让我逆向,结果实习也没找到。在苦闷了好多天后,我开始硬着头皮去翻一些开源软件的源码,认真看了三四个月,一边调试,一边记笔记,最后感觉整个人都不一样了。我是地质工程专业,上学的时候,我痴迷 C++ 编程,可是呢,我学的不是计算机专业,身边没啥能交流的人,那个时间知识付费也不像现在这么流行,所以总体上来说没什么可以请教的人。原创 2023-12-06 21:45:00 · 333 阅读 · 0 评论 -
如何写好 Git commit log?
介绍下目前字节跳动开发中使用的 git commit log 规范,内容与下列规范基本一致。Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。上面代码的-m参数,就是用来指定 commit mesage 的。如果一行不够,可以只执行git commit,就会跳出文本编辑器,让你写多行。基本上,你写什么都行(和但是,一般来说,commit message 应该清晰明了,说明本次提交的目的。目前,社区有多种 Commit message 的。本文介绍。原创 2023-12-05 21:18:44 · 861 阅读 · 0 评论 -
聊聊程序员常见的职业问题
Q23 我报了一个薪水之后,HR 爽快的答应了,我是不是报低了?我能不能再找他们提高一点?Q15 我是一名 Java 程序员,天天增删改查数据库,我如何实质性的提高自己?Q30 钱不够花,作为一名只会写代码的码农,我如何赚点外快呢?Q28 入职时人事说月薪低一点,年终奖多很多,我要不要同意?Q2 作为一个程序员,是进入大厂好,还是进入创业公司好?Q29 结婚有娃了,生活压力大,工资入不敷出,如何改变?Q3 我专科(或二本)毕业,学历不行,如何进大厂工作?Q21 技术面试中,面试官问我薪资,我该不该告诉他?原创 2023-12-05 20:29:55 · 753 阅读 · 0 评论 -
WebSocket一般会用在什么实际的场合?
WebSocket 是通信协议,其基于 TCP/IP 的应用层协议(改造后的 HTTP 协议),所以本质上就是 Socket 通信,每一个客户端会至少占用一个连接,和适不适合高并发没关系,高并发和 WebSocket 协议和通信技术本身没关系。》,这本书同时兼顾 Windows 和 Linux 两个平台,使用的是 C 语言和操作系统的 Socket API,通过这本书你能学会常用的操作系统 Socket API 和常用的网络模型,认真学完之后,你不会再纠结同步异步、阻塞非阻塞等概念。原创 2023-12-05 20:27:07 · 791 阅读 · 0 评论 -
一个 WebSocket 服务器是如何开发出来的?
对端收到该包时,如果发现标志 FIN = 0 或 OpCode = 0,将该包包体的数据暂存起来,直到收到 FIN = 1,OpCode ≠ 0 的包,将该包的数据与前面收到的数据放在一起,组装成一个完整的业务数据。需要注意的是,在使用 zlib 的 deflate 函数进行压缩时,压缩完毕后要将压缩后的字节流末尾多余的 4 个字节删掉,这是因为 deflate 函数在压缩后会将内容为 00 00 ff ff 的特殊标志放入压缩后的缓冲区中去,这个标志不是我们需要的正文内容。原创 2023-12-05 20:23:03 · 798 阅读 · 0 评论 -
Modern C++ 智能指针详解
默认情况下,智能指针对象在析构时只会释放其持有的堆内存(调用 delete 或者 delete[]),但是假设这块堆内存代表的对象还对应一种需要回收的资源(如操作系统的套接字句柄、文件句柄等),我们可以通过自定义智能指针的资源释放函数。假设现在有一个 Socket 类,对应着操作系统的套接字句柄,在回收时需要关闭该对象,我们可以如下自定义智能指针对象的资源析构函数,这里以。原创 2023-12-05 20:04:12 · 803 阅读 · 0 评论