手撕C++】内存管理:感受C++的魅力吧

内存管理基础

C++的内存管理分为栈(Stack)和堆(Heap)。栈由编译器自动分配释放,存储局部变量和函数调用信息;堆通过手动分配(new/delete或malloc/free)管理,生命周期由程序员控制。

  • 栈内存:高效但空间有限,超出容量导致栈溢出。
  • 堆内存:灵活但需手动管理,不当使用易引发内存泄漏或野指针。

动态内存分配

使用new和delete操作符:

cpp 复制代码
int* ptr = new int(42); // 分配一个int并初始化为42  
delete ptr;             // 释放内存  

数组分配需匹配new[]和delete[]:

cpp 复制代码
int* arr = new int[10]; // 分配10个int的数组  
delete[] arr;           // 释放数组  

智能指针

C++11引入智能指针自动管理堆内存:

  • unique_ptr :独占所有权,不可复制,移动语义转移所有权。

    cpp 复制代码
    std::unique_ptr<int> uptr(new int(10));  
  • shared_ptr :引用计数,多个指针共享所有权。

    cpp 复制代码
    std::shared_ptr<int> sptr = std::make_shared<int>(20);  
  • weak_ptr :解决shared_ptr循环引用问题,不增加引用计数。

内存泄漏检测

  • 工具:Valgrind、AddressSanitizer(ASan)等。
  • 编码习惯:优先使用智能指针,避免裸指针;RAII(资源获取即初始化)封装资源。

自定义内存管理

重载new和delete实现定制分配策略:

cpp 复制代码
void* operator new(size_t size) {  
    void* ptr = custom_alloc(size);  
    if (!ptr) throw std::bad_alloc();  
    return ptr;  
}  
void operator delete(void* ptr) noexcept {  
    custom_free(ptr);  
}  

性能优化

  • 内存池:预分配大块内存减少频繁分配开销。
  • 对齐分配 :使用alignas或平台特定API(如posix_memalign)提升访问效率。

常见陷阱

  • 悬垂指针:释放后未置空,后续访问导致未定义行为。
  • 双重释放:同一内存多次释放引发崩溃。
  • 类型不匹配 :new[]与delete混用导致未定义行为。

通过合理选择栈/堆、善用智能指针和工具检测,可高效安全地管理C++内存,充分发挥其性能优势。

相关推荐
weixin_460443563 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
sm_926787056 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev6 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209996 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说6 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha7 小时前
Lambda 表达式和函数式接口
java·开发语言
小白学大数据7 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
colinu7 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
学逆向的7 小时前
win32注入代码
开发语言·网络安全·api·win32