C++之动态内存分配

(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


相关推荐

  1. C语言动态内存分配malloc(初阶版)

    2024-07-19 16:04:02       46 阅读
  2. C语言-动态内存分配

    2024-07-19 16:04:02       51 阅读
  3. C动态内存分配与释放介绍

    2024-07-19 16:04:02       53 阅读
  4. C语言】(20)动态内存分配

    2024-07-19 16:04:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-19 16:04:02       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-19 16:04:02       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-19 16:04:02       58 阅读
  4. Python语言-面向对象

    2024-07-19 16:04:02       69 阅读

热门阅读

  1. Linux常用命令(持续更新)

    2024-07-19 16:04:02       19 阅读
  2. spring boot 实现token验证登陆状态

    2024-07-19 16:04:02       21 阅读
  3. nginx的安装和使用

    2024-07-19 16:04:02       21 阅读
  4. 深入了解 GCC

    2024-07-19 16:04:02       20 阅读
  5. 【MyBatis】Mybatis中的动态SQL——bind标签

    2024-07-19 16:04:02       20 阅读
  6. GreenDao实现原理

    2024-07-19 16:04:02       20 阅读
  7. 分布式缓存设计:深入理解 Memcached 架构

    2024-07-19 16:04:02       21 阅读
  8. 项目相关方不配合,项目经理怎么办?

    2024-07-19 16:04:02       21 阅读
  9. oneos虚拟文件系统vfs源码分析

    2024-07-19 16:04:02       17 阅读
  10. 富格林:正规手段识破欺诈套路

    2024-07-19 16:04:02       18 阅读
  11. Redis生产问题

    2024-07-19 16:04:02       19 阅读
  12. Makefile: 解决.c文件依赖.h文件的问题

    2024-07-19 16:04:02       17 阅读