2025-07-23 手写简化版shared_ptr:深入理解C++引用计数智能指针 手写简化版shared_ptr:深入理解C++引用计数智能指针 在C++开发中,内存管理一直是开发者必须面对的挑战。传统裸指针的显式delete操作不仅容易导致内存泄漏,还可能引发悬垂指针等问题。本文将带你从零实现一个简化版的shared_ptr,通过引用计数机制实现自动化内存管理。一、引用计数基本原理引用计数的核心思想是通过计数器跟踪资源被引用的次数,当计数归零时自动释放资源。这种机制需要解决三个关键问题: 计数器的存储位置(必须被所有引用共享) 线程安全性(本文示例暂不考虑) 循环引用问题(可通过weak_ptr解决,本文不涉及) 二、简化版SharedPtr实现我们首先定义核心结构体ControlBlock来保存引用计数:cpp template struct ControlBlock { T* ptr; sizet refcount;explicit ControlBlock(T* p) : ptr(p), ref_count(1) {} ~ControlBlock() { delete ptr; } };接下来实现SharedPtr类模板:cpp template class SharedPtr { ... 2025年07月23日 51 阅读 0 评论
2025-07-17 C语言字符串处理:从基础到实战的深度解析 C语言字符串处理:从基础到实战的深度解析 本文深入讲解C语言中字符串的本质、常用字符串处理函数的使用技巧及底层原理,包含10+个典型代码示例和内存安全注意事项,帮助开发者避开常见陷阱。一、C语言字符串的本质认知在C语言中,字符串本质是以'\0'(空字符)结尾的字符数组。这种设计决定了其与Java/Python等语言的根本差异——没有内置的字符串类型,所有操作都依赖字符数组和指针实现。c char str1[] = "Hello"; // 自动补\0 char str2[6] = {'H','e','l','l','o','\0'}; // 等价写法关键特性: - 内存连续存储 - 必须显式处理'\0' - 长度计算需要遍历(O(n)时间复杂度)二、核心字符串函数详解1. 字符串复制:strcpy vs strncpyc char dest[20]; // 基础用法(存在溢出风险) strcpy(dest, "Hello World");// 安全用法(推荐) strncpy(dest, source, sizeof(dest)-1); dest[sizeof(dest)-1] = '\0'; // 强制终止陷阱警示:s... 2025年07月17日 48 阅读 0 评论
2025-07-13 Golang函数返回指针的风险与变量逃逸机制解析 Golang函数返回指针的风险与变量逃逸机制解析 一、指针返回的潜在陷阱当我们在Go函数中返回局部变量的指针时,编译器会悄悄完成一个关键操作——变量逃逸(Escape Analysis)。这个看似简单的行为背后,隐藏着三个典型问题: 生命周期延长:局部变量本应在栈上随函数退出而销毁,逃逸后却不得不存活在堆上 GC压力增大:堆内存需要垃圾回收器介入处理,频繁逃逸会导致GC工作量激增 缓存命中率下降:堆内存访问速度比栈慢3-5倍,破坏CPU缓存局部性原理 go // 典型危险示例 func CreateUser() *User { return &User{Name: "Alice"} // 局部变量逃逸到堆 }二、变量逃逸的底层机制Go编译器在编译阶段会进行逃逸分析,决定变量存储位置。通过go build -gcflags="-m"可以看到逃逸分析结果:./main.go:5:6: can inline CreateUser ./main.go:6:10: &User literal escapes to heap逃逸判定标准: - 变量被外部引用(如返回指针) - 变量大小超过当前栈帧剩余空间 - 动态类... 2025年07月13日 57 阅读 0 评论