dlz0836
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
“函数指针”和“指针函数”区分清楚
函数指针 = 一个变量,值是函数的入口地址返回类型 (*指针名)(参数列表);指针函数 = 一个函数,返回值是指针返回类型 *函数名(参数列表);函数指针是“指向函数的变量”,指针函数是“返回指针的函数”,看括号,永远不会错。原创 2025-12-26 15:21:02 · 45 阅读 · 0 评论 -
深入拆解 引用计数(reference counting)
深入拆解 引用计数(reference counting):它的原理、常见陷阱、在大型/并发项目里为什么会出问题、内核/用户态常用的安全做法与模式、以及一整套可落地的防护与调试建议。会包含示例代码(C / C++ 风格)、常见 bug 场景与修复方式,以及工程化建议(检测、审计、性能替代方案)。原创 2025-11-18 11:40:08 · 69 阅读 · 0 评论 -
《C++ Primer 第五版》构造函数
构造函数(Constructor)是一个特殊的成员函数,用来在创建对象时初始化对象的状态。简单来说:它是在对象“出生”的那一刻自动被调用的“初始化函数”。比如public:int age;// 构造函数name = n;age = a;C++ 会自动调用来初始化这个对象。类型用途特点默认构造无参初始化可自动生成带参构造设置初值可重载拷贝构造拷贝对象默认浅拷贝移动构造转移资源提高性能委托构造构造函数复用C++11 引入默认/删除构造控制生成行为。原创 2025-11-05 09:18:25 · 55 阅读 · 0 评论 -
OPenssh6代码移植的依赖库 OpenSSL双库连接问题的解决方案
这些 PS_SOCKET / PS_CONNECT / …不是函数,只是字符串常量。它们的作用是告诉 dlsym() 去找协议栈库里的哪一个符号。这样做的好处是:协议栈 存在就用,不存在就回退,从而保证 ssh-agent 不会强制依赖整个大库。原创 2025-09-28 17:43:20 · 134 阅读 · 0 评论 -
多级 fork / 父子进程关系
父进程 fork 子进程(然后退出),子进程再 fork 孙进程(成为真正的守护进程)。:父进程只能获取直接子进程返回值,孙进程需自己处理或通过 IPC/文件告知。子进程会继承父进程打开的 fd,如果不关闭,可能导致文件锁或资源泄漏。好处:孙进程脱离控制终端,init 收养它,不会成为僵尸。会产生一个新进程,几乎是父进程的完整拷贝。子进程退出,父只需等待子进程,孙进程独立运行。直接子进程,孙进程返回值不会直接传给祖父。子进程退出,孙进程可能被 init 收养。父进程发送信号不会自动传递给孙进程。原创 2025-09-23 10:23:30 · 68 阅读 · 0 评论 -
《C++ Primer 第五版》const 成员函数
在 C++ 中,每个非静态成员函数都有一个隐藏的参数。const 对象只能调用 const 成员函数。指针本身不可改,但可以修改指向对象的内容。“这个函数不会修改对象本身的任何成员。的类型变化 → 指向只读对象。非 const 成员函数 =或 非const 成员函数。假设我们有一个函数只用来。:放心,我不会改对象,指向的对象也不可改(原创 2025-09-13 17:25:20 · 111 阅读 · 0 评论 -
《C++ Primer 第五版》函数重载(overload) 和 作用域(scope)
(无论参数是否相同)。原创 2025-08-28 16:58:18 · 405 阅读 · 0 评论 -
《C++ Primer 第五版》main 函数里处理命令行选项
带或--的东西,例如-v-o out.txt。-v-o;-abc等价于-a -b -c。--help。:不带的位置参数,例如里的。--,之后的一切都当作“位置参数”,不再当选项解析(即使以开头)。argcargvargc是参数数量,argv是 C 字符串数组。原创 2025-08-25 16:43:34 · 431 阅读 · 0 评论 -
《C++ Primer 第五版》initializer_list 涉及到的范围 for 循环(range-based for) 的语义差别
→elem是 const std::string&,高效,不拷贝。→elem是 std::string,每次都会拷贝,效率低。所以,一般遍历时推荐用引用,除非你明确需要拷贝。原创 2025-08-26 16:34:06 · 408 阅读 · 0 评论 -
《C++ Primer 第五版》省略符号(...)
C 的...= “袋子”,丢多少个参数进去都行,但取出来要小心(用va_arg),类型不安全。C++ 的...= “魔法展开符”,可以把一包模板参数展开成一串,既灵活又安全。C++17 之后,还能写折叠表达式,更简洁。👉 形象比喻:C 的...像是快递袋子,里面放什么快递员不管,你自己拆开得对照单子,不然拆错了就坏了。C++ 的...像是拼装积木,编译器帮你一块块展开拼起来,不会出错。原创 2025-08-25 18:02:19 · 294 阅读 · 0 评论 -
《C++ Primer 第五版》什么情况下返回的引用无效?什么情况下返回常量的引用无效?
引用类型无效情况普通引用T&1. 指向局部变量返回后2. 指向临时对象3. 指向已释放/已删除的内存常量引用const T&1. 指向局部变量返回后2. 指向临时对象返回后(局部临时对象)3. 指向已释放/已删除的内存关键区别const引用可以绑定到临时对象,并延长临时对象的生命周期到引用作用域,但不能跨函数返回临时对象的引用。普通引用不允许绑定临时对象。原创 2025-08-27 14:09:17 · 361 阅读 · 0 评论 -
《C++ Primer 第五版》函数重载
👉同一个作用域下,有多个函数,名字相同,但参数列表不同,编译器会根据调用时传入的参数来决定调用哪个函数,这就叫函数重载。print(10);// 调用 print(int)// 调用 print(double)// 调用 print(string)原创 2025-08-28 14:21:16 · 213 阅读 · 0 评论 -
《C++ Primer 第五版》引用形参什么时候应该是常量引用?如果形参应该是常量引用,而我们将其 设为了普通引用,会发生什么情况?
能用const&就别用只读、避免拷贝 → 用const&确实需要修改实参 → 用错误写法的后果实参可能被无意修改(逻辑 bug)无法传临时对象/字面量(接口受限)语义不清晰(可维护性差)原创 2025-08-25 09:59:30 · 465 阅读 · 0 评论 -
《C++ Primer 第五版》this 指针 (上)
场景示例说明区分同名形参左边是成员,右边是形参返回当前对象本身访问当前对象成员一般可省略this->原创 2025-09-13 16:54:29 · 160 阅读 · 0 评论 -
《C++ Primer 第五版》c++的调试方法
C++ 调试就像侦探办案:日志是“目击者证词”,调试器是“现场显微镜”,内存工具是“警犬嗅探器”,性能工具是“测速仪”。你要善于组合使用,才能快速锁定“真凶”。原创 2025-09-02 16:13:47 · 868 阅读 · 0 评论 -
《C++ Primer 第五版》 initializer_list
{}花括号背后的秘密。常用在容器初始化和函数参数传递。本质:指针 + 大小,只读轻量容器。优点:让 C++ 初始化和调用看起来更简洁,像脚本语言。一句比喻:就像一次性快餐盒花括号{}放进什么,它就原封不动地打包。你可以拿来吃(遍历),但不能往里面加菜(只读)。盒子本身很轻,拷来拷去都没问题。原创 2025-08-25 17:11:52 · 385 阅读 · 0 评论 -
《C++ Primer 第五版》this 指针 (下)
this内容解释this指向当前对象的指针类型,如果在const函数中是常见用法1. 区分成员和同名形参 2. 返回*this实现链式调用 3. 传递当前对象地址。原创 2025-09-13 16:47:08 · 100 阅读 · 0 评论 -
《C++ Primer 第五版》多维数组的传参
二维数组在内存里是的 6 个int也就是“这点决定了:编译器要知道“”,才能算偏移量i*cols + j。这就是传参时为什么“必须知道(至少)最内层维度”的根本原因。原创 2025-08-25 15:15:02 · 497 阅读 · 0 评论 -
《C++ Primer 第五版》内联函数和constexper函数
inline就像你写作业时,把常用的公式抄到草稿纸上,方便随时用,不用每次都去翻课本。constexpr就像老师在考试前直接给你算好了一部分答案,你带着结果进考场(编译期就确定)。特性inlineconstexpr本质展开函数,省去调用开销编译期求值,生成常量执行时间运行时尽可能编译期是否隐含 inline否是场景短小函数常量计算、模板参数✅一句话记忆inline是“复制粘贴函数体”,让运行时更快。constexpr是“编译器提前算答案”,让常量在编译期就确定。原创 2025-09-02 14:01:35 · 463 阅读 · 0 评论 -
《C++ Primer 第五版》函数指针的几种写法总结
最原始的办法:缺点是类型写法冗长,尤其在容器里。3. decltype(&函数名)直接从函数推断出指针类型:这样避免手写参数列表,尤其在函数签名很复杂时很有用。利用 里的模板元编程工具:好处:在模板代码里很灵活(比如先拿到函数类型,再转成指针)。如果不介意一点性能开销,可以用更现代、更安全的 :优点:支持函数指针、lambda、仿函数,多态性更强。缺点:比裸函数指针多一次封装,性能略低。如果你有很多不同签名的函数,可以封装成模板:这样写高度通用,尤其适合库代码。原创 2025-09-05 15:12:08 · 395 阅读 · 0 评论 -
《C++ Primer 第五版》返回数组指针的几种方法
声明返回数组指针的函数最原始的写法是。原创 2025-08-27 16:31:44 · 235 阅读 · 0 评论 -
《C++ Primer 第五版》默认实参初始值
名字解析:在函数声明处完成,决定默认参数“绑定到哪个变量/函数”。表达式求值:在函数调用处发生,用的是绑定对象的当前值。局部同名变量不会改变默认参数绑定,因为解析已经固定在声明处的作用域。📌 所以看到的现象:改变def(全局变量) → 默认实参生效变化定义局部wd(只是隐藏了全局 wd) → 默认实参依然用全局的 80。原创 2025-08-28 17:45:52 · 445 阅读 · 0 评论 -
《C++ Primer 第五版》auto和deltype用于函数指针类型
auto(同数组会退化为指针),除非你用引用类型auto&auto&&。若expr是(变量或函数名),decltype给出声明的类型(函数名 →函数类型,不是指针)。否则,如果expr是返回T&;是返回T&&;是返回T。小结:用auto想要“变量能直接用”的函数指针通常最方便;用decltype想要“得到函数的(或引用/指针)”时更精确,但要注意括号和是否是 id-expression 的差别。原创 2025-09-05 14:46:45 · 643 阅读 · 0 评论 -
《C++ Primer 第五版》重载和 const 形参
用。原创 2025-08-28 14:58:48 · 333 阅读 · 0 评论 -
《C++ Primer 第五版》不要返回局部对象的引用或指针
局部变量在栈上,函数结束即销毁;别把引用/指针带出去,否则就是悬空雷。⚡️所以,不要返回局部对象的引用或指针,因为函数返回后局部变量生命周期结束,引用/指针会指向无效内存,导致未定义行为。而正确做法是:用静态局部变量堆分配值返回或传出参数。原创 2025-08-26 17:41:38 · 495 阅读 · 0 评论 -
《C++ Primer 第五版》 默认实参
就是在函数声明或定义的时候,给参数一个默认值。调用时如果调用者没传这个参数,编译器就会用默认值来补上。\n";greet();编译器在调用点帮你“自动填补参数”。原创 2025-08-28 17:17:06 · 247 阅读 · 0 评论 -
《C++ Primer 第五版》assert 宏 和 NDEBUG 预处理宏变量
如果为假 → 向标准错误输出报错信息(表达式、文件名、行号),并调用。就像你写代码时的“安全带”,确保某个假设为真,否则立刻报警停车。就像把安全带“剪掉”,让车可以随便跑,不会因为警报停下来。宏在编译阶段就会被替换掉,不会有任何运行时开销。Release 模式下它可能被编译掉,完全没效果。发布阶段:去掉安全带,车能跑得更快,但要自己负责。如果为真 → 什么都不做,继续执行。用法:调试阶段开着,发布阶段关掉。调试阶段:戴上安全带,保护自己。:调试时验证假设,失败就中断。,即什么都不做,彻底失效。原创 2025-09-02 16:06:26 · 659 阅读 · 0 评论 -
C的调试手段总结(三)非入侵式
C 模版改进一下,让调用栈日志,完全可用在 Linux 下。原理是利用addr2line来解析返回的地址。原创 2025-09-02 14:44:41 · 66 阅读 · 0 评论 -
C的调试手段总结(二)非入侵式
如果if条件非常稀有,可能一天才触发一次。如果你用 gdb 一直挂着等待,那几乎不可行(既影响系统,又很难等)。这种场景下,我们就不适合用“交互式调试器实时盯着”。在 Linux 下,常用的做法是用。原创 2025-09-02 14:42:12 · 78 阅读 · 0 评论 -
C的调试手段总结(一)入侵式
调试时自动显示调用栈(通常在左侧或下方的。设置断点:在函数内部的某一行点一下。原创 2025-09-02 14:34:33 · 110 阅读 · 0 评论 -
《C++ Primer 第五版》int (*func())(int,int) 和 int (*func)(int,int) 区别剖析
写法func 是什么返回/指向什么使用场景变量指向函数直接存函数指针,调用或切换函数函数返回函数指针工厂函数/策略选择/返回可调用逻辑✅关键点()的存在决定了 func 是函数而不是变量。所以是正确的写法,用于函数返回函数指针。如果你写成,表示的是函数指针变量,二者不可混用。原创 2025-08-27 16:26:36 · 75 阅读 · 0 评论 -
《C++ Primer 第五版》 函数指针、返回函数指针、回调函数、普通函数调用 之间的关系理顺
类型声明示例本质用途普通函数可被调用的代码直接调用函数指针变量保存函数地址的变量动态调用,回调回调函数参数是函数指针把逻辑传给别人执行返回函数指针函数返回函数指针工厂函数 / 策略选择 / 延迟调用是否是函数指针变量和调用顺序函数本身 → 可以直接调用,也可取地址。函数指针变量 → 保存函数地址,间接调用。回调 → 函数指针作为参数传递。返回函数指针 → 函数返回函数指针,得到指针后再调用。原创 2025-08-27 16:22:51 · 66 阅读 · 0 评论 -
《C++ Primer 第五版》深度剖析对比:int* func()、int (*func())[5]、int (*func())(int,int)
声明含义指向/返回的是什么运算性质常见用途函数返回int*数据元素或数组首元素地址+1增加返回单元素地址、动态内存函数返回int (*)[5]指向整个int[5]数组+1增加返回固定大小数组的地址(较少见)函数返回指向函数(代码)不参与数据算术,可被调用返回某个可调用逻辑(策略/回调选择)原创 2025-08-27 16:19:43 · 103 阅读 · 0 评论 -
《C++ Primer 第五版》C/C++函数的指针的函数调用
和“指向变量的指针”一样,函数指针保存的是函数入口地址。它的类型必须完整描述函数的参数列表和返回值类型。有两种写法,等价:为什么两者都行? 这个调用运算符可以作用在“函数”或“指向函数的指针”上;当你写 时,编译器会把 当作 处理。在 C 标准库里,/ 等都需要回调函数指针: 修饰的是指针本身,不是函数(函数不是对象)。非静态成员函数有隐式 参数,类型不同:不能把 赋给 。需要给 C 接口传回调时,常用 lambda/std::bind 适配,或改为原创 2025-08-20 10:58:23 · 383 阅读 · 0 评论 -
《C++ Primer 第五版》 const实参和形参(下)
const 引用 = 只读别名可以接收常量、临时对象(延长生命周期),这点普通引用做不到函数参数里用const &是最佳实践(高效 + 通用)函数返回用const &表示“只读访问”,但要注意别返回局部变量的引用(会悬空!声明能不能改原值能不能接临时值int& r✅ 可以改❌ 不行❌ 不能改✅ 可以。原创 2025-08-22 14:23:58 · 126 阅读 · 0 评论 -
《C++ Primer 第五版》 const实参和形参(上)
const 形参= 承诺 “不会改”实参传给 const 形参= 没问题(放宽要求)const 实参传给非 const 形参= 错误(收紧要求)const 修饰指针:看离谁近→ *p 不能改,p 能改→ *p 能改,p 不能改→ *p 不能改,p 也不能改。原创 2025-08-22 14:13:43 · 187 阅读 · 0 评论 -
《C++ Primer 第五版》C++ 对大多数二元运算符不规定求值顺序 讲解
我认为 C++ 对大多数二元运算符不规定求值顺序 这种做法是可以接受的,但它对程序员提出了一个前提要求:写的代码必须规避依赖于求值顺序的情况。理由可以从 语言设计哲学 和 工程实践 两个角度来分析。C++ 继承自 C,设计目标之一就是 尽可能贴近硬件、给编译器最大优化空间。如果标准强制规定求值顺序,比如必须从左到右或从右到左,那编译器生成机器码时可能会受限,尤其是在寄存器分配、指令调度、流水线优化等方面。例如:如果规定必须先算 再算 ,编译器就不能自由安排调用顺序,即使交换顺序能更快。在某些 C原创 2025-08-08 09:43:17 · 391 阅读 · 0 评论 -
《C++ Primer 第五版》C++里最“坑”的隐式类型转换之一:数组衰减(array-to-pointer decay) & 函数衰减(function-to-pointer decay)
默认衰减:数组→T*指向首元素;函数→函数指针。遇到“谈本体”的运算/语境就不衰减sizeoftypeiddecltype引用绑定。多维数组:记住是“指向一整行的指针”T (*)[列],不是T**。写接口:要么用“数组引用/模板/std::arraystd::span”保留长度,要么显式传长度。原创 2025-08-15 13:52:56 · 770 阅读 · 0 评论 -
《C++ Primer 第五版》逻辑与、逻辑或及相等性运算符中运算对象求值的顺序
如果两个操作数都含有副作用(修改同一个变量),可能导致未定义行为或结果不一致。编译器可以先计算左操作数,也可以先计算右操作数,这取决于优化策略。:逻辑与运算结果只在两边都为真时才为真,如果左边已经是。,甚至在同一编译器的不同优化等级结果都可能不同。(短路求值 short-circuit)。:逻辑或运算结果只要一边为真结果就是。没执行,因为左边已经是。:两个操作数都会被计算。在某些编译器可能先计算。,右边没有必要再计算。(假货挡路,后面不看)(真货到手,后面不看)(同样是短路求值)。原创 2025-08-08 10:59:54 · 342 阅读 · 0 评论 -
《C++ Primer 第五版》C++ 强制类型转换
把不同目的拆开,让编译器帮你“守住边界”。你选择哪一种,编译器就按你的意图来检查、限制或放行。最常用、最安全的强转。适合:数值之间(含显式收窄)指针的上行转换(派生 → 基类)对于非多态层次的“相信我没错”的下行转换(存在风险) ↔ 任意对象指针调用显式构造或用户自定义转换( 也得你自己写 cast)记忆要点: 不改 CV 限定、不做运行期检查,快但可能错在运行时。仅用于多态类层次(基类至少有一个 )。适合:向下转换(基 → 派生)同层交叉(兄弟类)经由基类指针/引用多继承/虚继承时,能正确调整指针偏原创 2025-08-16 15:42:19 · 982 阅读 · 0 评论
分享