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++内存管理不仅能提升代码健壮性,还能有效避免内存泄漏等常见问题。理解其底层原理,将帮助开发者在复杂场景下做出更优设计决策。
相关推荐
慧都小妮子14 分钟前
跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用
开发语言·python·api·jxbrowser·chrome 扩展程序
范纹杉想快点毕业16 分钟前
C++多重继承详解与实战解析
开发语言·c++
shenyan~18 分钟前
关于 smali:2. 从 Java 到 Smali 的映射
java·开发语言
天桥下的卖艺者31 分钟前
R语言使用随机过采样(Random Oversampling)平衡数据集
开发语言·r语言
星star~31 分钟前
MyBatis相关面试题
java·开发语言·mybatis
MABO-mb37 分钟前
Java实现命令行图书管理系统(附完整源码)
java·开发语言
AllWe$1 小时前
三、kafka消费的全流程
java·开发语言
tanyyinyu1 小时前
Python函数参数详解:从位置参数到灵活调用的艺术
运维·开发语言·python
太空1号1 小时前
飞腾D2000,麒麟系统V10,docker,ubuntu1804,小白入门喂饭级教程
linux·c++·docker
小疯仔2 小时前
使用el-input数字校验,输入汉字之后校验取消不掉
android·开发语言·javascript