目录
(1)动态内存分配概述
A. C++内存空间模型
B. What(什么是动态内存分配)
一种程序在 运行时 内存申请和释放的机制
C. Why(为什么要进行动态内存分配)
- 提升灵活性:静态内存分配需要编译器在程序编译时知道分配内存的大小,而动态内存分配机制则允许在程序运行时分配内存空间
- 便于内存管理:动态地创建和销毁对象,提供了灵活的内存管理方式
- 动态调整数据结构:如vector数据结构会在不足时重新分配内存空间
D. How(如何进行动态内存分配)
在C语言中,使用malloc和free来申请和释放堆栈中的内存空间
在C++中,使用new和delete来申请和释放堆栈中的内存空间
//使用C格式管理动态内存的分配和释放
const int SIZE = 1024;
int * ptrArrC = (int *)malloc(SIZE * sizeof(int));
free(ptrArrC);
//使用C++格式管理动态内存的分配和释放
int * ptrArrCPlus = new int[SIZE];
delete [] ptrArrCPlus;
(2)定位new运算符
A. What(什么是定位 new 运算符)
在指定的内存中创建对象
double dArr[1024];
double ptrArr = new (&dArr[0]) double(100.0);
B. Why(定位 new 运算符的作用)
- 在预先分配的内存区域上创建对象,而不一定是在堆中开辟动态内存空间
- 特定的内存位置上创建对象,并根据需要提供参数来初始化对象
- 将对象放置在满足对齐要求的合适内存地址上,以满足底层系统的需求
C. How(如何使用定位 new 运算符)
需要注意的是:当管理的是类对象或结构体对象时,调用它的析构函数并不会释放动态内存空间
因此,正确的做法是调用delete运算符,该运算符会首先调用类对象的析构函数来销毁对象,然后回收动态内存
(3)重载new和delete
下图展示了重载new和delete运算符的方式,值得一提的是:当我们将下列运算符函数定义成类的成员函数时,它们都是隐式静态的(即默认是静态成员函数)
实例说明:
注意:上述代码在使用malloc存在一定问题,因为malloc分配的是字节数,所以在具体使用的时候应该乘以sizeof(obj),即乘以所存对象占用的内存大小
================================================================================
若读者对C++感兴趣,欢迎阅读笔者在学习C++过程中的关于其知识点的总结系列,入口如下:
C++知识点总结全系列文章索引:
【C++知识点总结全系列 (01)】:数据类型、数据类型转换和变量
【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结
【C++知识点总结全系列 (03)】:函数(函数参数传递、可变参数、函数返回值等详细介绍)
【C++知识点总结全系列 (04)】:C++类的详细总结与分析
【C++知识点总结全系列 (05)】:IO 类的详细总结和分析
【C++知识点总结全系列 (06)】:STL六大组件总结- 配置器、容器、迭代器、适配器、算法和仿函数
【C++知识点总结全系列 (07)】:模板与泛型编程详细总结与分析
【C++知识点总结全系列 (08)】:面向对象编程OOP