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

相关推荐
程与留3 小时前
15_国际化和本地化:tr()、ts 文件、QM 文件、多语言切换
c++·qt
程与留4 小时前
14_Qt 样式表(QSS)入门(语法、选择器、美化实战)
c++·qt
欧特克_Glodon13 小时前
OpenCV计算机视觉开发入门与实践<二十七>:图像分割概述
c++·人工智能·opencv·计算机视觉
蒸蒸yyyyzwd13 小时前
cpp 选手秋招学习笔记 day21
c++·面试·八股
Interview Aid11213 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
CoderIsArt21 小时前
C#中UI 线程与 Dispatcher
开发语言·ui·c#
AI情绪识别开源1 天前
检信 ALLEMOTION OS 加密打包可执行程序 — 全面测试报告版本: v1.3功能测试 / 性能测试 /
开发语言·数据结构·人工智能·功能测试
「QT(C++)开发工程师」1 天前
C++ auto 用法详解
开发语言·c++
OPEN-F1 天前
C++STL教程:容器适配器与实用工具
开发语言·c++