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


  • 56
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值