C++(22)—内存管理

文章目录

一、C语言动态内存管理回顾

1. malloc/calloc/realloc/free基本用法

C语言通过以下函数管理堆内存:

复制代码
malloc:分配指定字节数的未初始化内存

calloc:分配并清零内存(适合数组)

realloc:调整已分配内存的大小

free:释放内存

示例代码:

cpp 复制代码
void Test() {
    int* p1 = (int*)malloc(sizeof(int));  // 分配单个int空间
    int* p2 = (int*)calloc(4, sizeof(int));  // 分配4个int空间并清零
    int* p3 = (int*)realloc(p2, 10 * sizeof(int));  // 扩展为10个int空间
    
    free(p3);  // 只需释放realloc后的指针
    // free(p2);  // 错误!p2已被realloc释放
}

2. C语言内存管理的局限性

复制代码
不初始化对象:需手动初始化

类型不安全:返回void*需强制转换

无构造/析构:无法处理自定义类型的生命周期

二、C++内存管理方式:new与delete

1. new/delete操作内置类型

cpp 复制代码
void Test() {
    int* ptr1 = new int;          // 分配未初始化的int空间
    int* ptr2 = new int(10);      // 初始化为10
    int* ptr3 = new int[3];       // 分配3个int的数组

    delete ptr1;      // 释放单个元素
    delete ptr2;
    delete[] ptr3;    // 释放数组(必须用delete[])
}

2. new/delete操作自定义类型

**核心优势:**自动调用构造函数和析构函数

cpp 复制代码
class A {
public:
    A(int a = 0) : _a(a) { cout << "A()" << endl; }
    ~A() { cout << "~A()" << endl; }
private:
    int _a;
};

int main() {
    A* p1 = new A(1);       // 调用构造函数
    delete p1;              // 调用析构函数

    A* p2 = new A[3];       // 调用3次构造函数
    delete[] p2;            // 调用3次析构函数
    return 0;
}

三、new/delete的底层机制

1. operator new与operator delete

复制代码
operator new:全局函数,通过malloc申请空间,失败时抛出异常

operator delete:全局函数,通过free释放空间

伪代码解析:

cpp 复制代码
void* operator new(size_t size) {
    void* p = malloc(size);
    if (p == nullptr) throw bad_alloc();
    return p;
}

void operator delete(void* p) {
    free(p);
}

2. new/delete的实现原理

复制代码
new流程:

调用operator new分配内存

在分配的内存上调用构造函数

delete流程:

调用析构函数清理资源

调用operator delete释放内存

数组操作扩展:

new[]:调用operator new[],实际调用operator new分配连续空间

delete[]:调用每个元素的析构函数后释放内存

四、malloc/free与new/delete的对比

五、最佳实践与常见问题

1. 使用建议

复制代码
匹配使用:new与delete配对,new[]与delete[]配对

优先选择new/delete:尤其处理自定义类型时

异常安全:使用try-catch处理内存分配失败

2. 常见错误

复制代码
内存泄漏:未释放已分配内存

cpp
复制
int* p = new int;
// delete p;  // 忘记释放!
类型不匹配:混用delete和delete[]

cpp
复制
int* arr = new int[5];
delete arr;    // 错误!应用delete[]
悬垂指针:释放后继续访问指针

cpp
复制
int* p = new int(10);
delete p;
cout << *p;    // 危险!p指向已释放内存

六、总结

复制代码
C++内存管理优势:通过new/delete实现类型安全、自动构造/析构调用。

底层机制:依赖operator new/delete实现,本质仍基于malloc/free。

适用场景:优先使用new/delete,仅在需要与C代码交互时使用malloc/free。

掌握C++内存管理不仅能提升代码健壮性,还能有效避免内存泄漏等常见问题。理解其底层原理,将帮助开发者在复杂场景下做出更优设计决策。
相关推荐
黄雪超4 分钟前
JVM——Java语法糖与Java编译器
java·开发语言·jvm
旷野本野5 分钟前
【JavaWeb+后端常用部件】
java·开发语言
坐吃山猪6 分钟前
Python多环境管理指南
开发语言·python
wang__1230016 分钟前
力扣2680题解
算法·leetcode·职场和发展
wen__xvn27 分钟前
每日一题洛谷P8615 [蓝桥杯 2014 国 C] 拼接平方数c++
c++·职场和发展·蓝桥杯
大G哥33 分钟前
Rust 之 trait 与泛型的奥秘
java·开发语言·jvm·数据结构·rust
刘梓谦35 分钟前
Qt获取CPU使用率及内存占用大小
开发语言·c++·qt
珊瑚里的鱼38 分钟前
第八讲 | stack和queue的使用及其模拟实现
开发语言·c++·笔记·visualstudio·stl·学习方法·visual studio
suyukangchen40 分钟前
深入理解 Linux 阻塞IO与Socket数据结构
linux·数据结构·python
isyangli_blog44 分钟前
(1-1)Java的JDK、JRE、JVM三者间的关系
java·开发语言·jvm