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

内存管理基础

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

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

动态内存分配

使用newdelete操作符:

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(资源获取即初始化)封装资源。

自定义内存管理

重载newdelete实现定制分配策略:

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++内存,充分发挥其性能优势。

相关推荐
IvanCodes1 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae3 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
qq_2518364575 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理6 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手6 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
qq_199886876 小时前
第8板块·第2节:统一内存的高级特性与性能调优
c++·人工智能·gpu算力·cuda
+VX:Fegn08956 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长7 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
2401_839080547 小时前
C++常见八股
数据结构·c++·算法
qq_199886878 小时前
第6板块 第2节 CUDA运行时API与驱动API 核心笔记
c++·人工智能·gpu算力