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

相关推荐
m0_640309301 小时前
解决 Python 报错:ModuleNotFoundError: No module named ‘pkg_resources’
开发语言·python
编码浪子1 小时前
Rust 1.95 稳定版解读与生态新动向
开发语言·后端·rust
asdzx671 小时前
告别手动校对:使用 Python 对比两个 PDF 文档的差异
开发语言·python·pdf
Rust研习社1 小时前
Rust 操作 Redis 从入门到生产级应用
开发语言·redis·后端·rust
xyq20241 小时前
Memcached stats items 命令详解
开发语言
Evand J1 小时前
【MATLAB例程】多传感器协同DOA目标跟踪与EKF滤波,输出动态目标轨迹、轨迹误差对比分析
开发语言·matlab·目标跟踪·滤波·定位·导航
csbysj20201 小时前
《jEasyUI 自定义分页》
开发语言
初心未改HD1 小时前
Go语言Context深度解析与工程实践
开发语言·golang
大袁同学1 小时前
【进程间通信】:洞穿边界修管道,映射内存渡进程
linux·c++·管道·进程间通信·ipc