首页 > 系统相关 >C++之动态内存分配

C++之动态内存分配

时间:2024-07-18 08:59:16浏览次数:23  
标签:总结 知识点 C++ 运算符 动态内存 new 分配

目录

(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


标签:总结,知识点,C++,运算符,动态内存,new,分配
From: https://blog.csdn.net/qq_42279379/article/details/140476208

相关文章

  • C++--accumulate介绍
    在C++中,accumulate是一个用于对容器中的元素进行累加操作的函数模板,位于头文件中。它允许你对容器(如vector或array)中的元素进行累加运算,并返回累加的结果。源代码展示template<classInputIterator,classType>Typeaccumulate(InputIterator_First,//开始迭代......
  • C++:哈希表特性及开散列哈希表的模拟实现
    目录一、unordered_map1.1特性1.2接口1.21构造函数1.22 iteratorfind(constK& key)1.23 insert1.24 operator[]1.25 erase1.26find1.3哈希概念1.31闭散列哈希表1.32开散列哈希表二、部分功能模拟实现hashtable.hunordered_map.hunordered_set.h......
  • 真的求求点赞+关注+收藏了!!(c++小游戏3)(还有其它的)
    13、球球大作战//奇怪的游戏#include<bits/stdc++.h>#include<windows.h>#include<conio.h>usingnamespacestd;voidpass(){CONSOLE_CURSOR_INFOcursor_info={1,0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info);}intjj......
  • Linux C++ 059-设计模式之备忘录模式
    LinuxC++059-设计模式之备忘录模式本节关键字:Linux、C++、设计模式、备忘录模式相关库函数:概念备忘录模式(MementoPattern),又叫做快照模式(SnapshotPattern)或Token模式,是GoF的23种设计模式之一,属于行为模式。定义(源于GoF《设计模式》):在不破坏封闭的前提下,捕获一个......
  • Linux C++ 060-设计模式之单例模式
    LinuxC++060-设计模式之单例模式本节关键字:Linux、C++、设计模式、单例模式相关库函数:概念单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对......
  • C++ 基础 - 3 - 数据类型
    简言什么是数据类型?数据类型(DataTypes)是变量或函数返回值的属性,它们决定了变量可以存储哪种类型的数据,以及这些数据如何被解释和存储在计算机的内存中。C++是一种静态类型语言,这意味着每个变量都必须在使用前声明其类型。C++提供了丰富的数据类型,可以分为几大类:基本......
  • C++ 基础 - 2 - 变量常量
    简言什么是变量与常量在计算机编程中,变量是存储数据的一种容器。它可以用于存储各种类型的数据,如整数、浮点数、字符串等。变量的值可以随时改变。常量与变量相反,常量是一个固定的值,它在程序运行期间是不会改变的。常量在程序中起到类似变量的作用,但其值是固定的,不能被......
  • C++学习第一天
    CPP的学习day11.VisualStudio的学习安装跳过……1.创建项目选择创建新项目因为是学习,选择第二个控制台应用分配好后点击创建等一会儿就创建好了……先修改设置:右击选择属性然后改为如下图2.CPP的表达式概念表达式就是运算符和操作数的序列,指定一项计算,表达式的求......
  • c++中结构体与类的区别
    在C++中,结构体(struct)与类(class)在功能上非常相似,实际上他们之间的主要区别在于默认的访问权限和继承方式。下面详细解释这两种类型的区别:结构体与类最大的不同就在于访问权限默认访问权限结构体(struct):默认的成员访问权限是公开的(public)。这意味着,除非显式地指定访问......
  • C++竞赛优化技巧与考场实用技巧
    在洛谷观看更加简约哦~:一键直达距离2024CSP/NOIP已经不远了,在这里,我便分享一下我总结出来的竞赛优化技巧时间优化算法/数据结构优化在处理一些问题,我们可以采用更高效的算法/数据结构来代替低效的算法/数据结构。例如,你需要多次求一段区间的和时,一般会采用循环直接......