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

动态内存分配(C++)

时间:2024-06-22 22:01:34浏览次数:12  
标签:释放 动态内存 int 动态分配 静态 C++ 数组 new 分配

什么叫动态分配?

形象来说,动态分配就像是在一个大型购物广场中,你根据需要随时租用或归还一个店铺。程序运行时,如果需要更多空间来存储数据,就会向操作系统 “租用” 内存空间;用完后,为了避免浪费资源,需要 “归还” 这些空间。这个过程不是自动的,需要你手动管理。

动态分配的优点

  • 灵活性:需要的时候用,不需要的时候还;

    动态分配最核心的地方就是它可以在不需要的时候归还。比如,在某个函数中定义了一个数组 a[5],当这个数组满了之后我们需要对其扩容,if (数组满) a扩容到10,如果这个数组是动态分配的,我们就可以手动的释放之前的 a[5];如果这个数组是静态分配的,这个空间无法释放,会一直占用,直到程序运行结束。

  • 不会占用栈和数据段的空间,为内存减轻负荷;
  • 举例:动态定义的顺序表 \(\text{vs}\) 静态定义的顺序表、动态实现的链表 \(\text{vs}\) 静态实现的链表;

    链表需要进行频繁的插入和删除,如果使用的静态分配,那么这些插入删除的空间在程序运行时将无法释放,只有使用动态分配才有办法在程序运行时释放这些空间,因为静态分配不提供释放空间的方法。

动态分配的语法解释

动态分配的变量

int a = 10;     // 静态分配一个整型
int *b = new int(10);   // 动态分配一个整型

delete b;

这两条语句的功能类似,都得到了一个值为 \(10\) 的变量,只不过变量 a 存储在栈内存中,b 存储在堆内存中;在程序运行时,a 会一直占用这个空间,无法主动释放,b 可以主动释放。

为什么要主动释放?如果我们静态实现了一个链表,每次插入的时候需要分配一个新结点,由于是静态分配的,这个新结点将存在栈内存中;每次删除的时候,虽然链表在逻辑上将其删除了,但是它还是占用着栈空间的;在多次的插入和删除后,将会导致栈溢出,从而发生段错误;使用动态分配就不会这样了,它不仅可以手动释放空间,还不会占用栈内存。

  • 使用 new 关键字进行动态分配时,它总是返回一个指针,指向新分配的内存地址,因为 new 的本质就是申请一份空间;
  • 有借有还,申请了空间,必须手动释放;
  • 访问的时候和指针一样,如果访问内容需要使用 *a

动态分配的数组

int staticArray[5] = {1, 2, 3, 4, 5};   // 静态分配一个整型数组
int *dynamicArray = new int[5]; // 动态分配一个整型数组

delete[] dynamicArray;          // 释放动态分配的整型数组
  • 动态分配数组在 new 的时候使用的是 [元素个数],动态分配变量在 new 的时候使用的是 (元素值)
  • 不能直接利用列表赋值,通常用 for 循环遍历赋值;
  • 访问时与数组类似,又两种访问方式,第一种是利用指针,比如 *(p+1),第二种直接使用数组下标 p[1]。感觉和数组相同;

动态分配的结构体

struct Person {
    string name;
    int age;
};

Person alice = {"Alice", 20};   // 静态分配并初始化一个结构体

Person *Mike = new Person{"Mike", 30};  // 动态分配并初始化一个结构体
delete Mike;

参考

  • 零壹考研

标签:释放,动态内存,int,动态分配,静态,C++,数组,new,分配
From: https://www.cnblogs.com/tamtam/p/18262712

相关文章

  • 深入讲解C++基础知识(一)
    目录一、基本内置类型1.类型的作用2.分类3.整型3.1内存描述及查询3.2布尔类型——bool3.3字符类型——char3.4其他整型4.有符号类型和无符号类型5.浮点型6.如何选择类型7.类型转换7.1自动类型转换7.2强制类型转换7.3类型转换总结8.类型溢出8.1注意......
  • C++ STL容器操作:6种常用场景算法
    C++STL容器操作:6种常用场景算法    •   引言   •   概述   •   查找与计数   ▪   std::find   ▪   std::find_if   ▪   std::find_if_not   ▪   std::find_end   ▪   std::find_first_of......
  • 【C语言/C++干货系列】你真的了解数组吗?
    目录广告前言一维数组二维数组字符数组尾声广告                      点击......
  • 2024华为OD机试真题- 找出作弊的人-(C++/Python)-C卷D卷-100分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++) 题目描述公司组织了一次考试,现在考试结果出来了,想看一下有没人存在作弊行为,但是员工太多了,需要先对员工进行一次过滤,再进一步确定是否存在作弊行为。过滤的规则为:找到分差最小的员工ID对(p1,p2)列表,要求p1<......
  • TJU智算-23年夏令营机试-第4题-算力分配
    ProblemDetail-2023年TJDX计算机院夏令营上机测试-第4题-算力分配-CodeFun2000题目内容小C有一批服务器,服务器以算力作为指标。现他需要给服务器分配任务,每个服务器只能承接一个任务,每个任务需要足够算力的服务器才能完成,即任务所需要的算力x应当小于服务器的算力y。现......
  • C++精解【2】
    文章目录数据类型基本数据类型更多类型sizeof正则表达式单次匹配多次匹配组匹配字符串的匹配数据类型基本数据类型在C++中,基本数据类型包括整数类型、浮点类型和字符类型。整数类型包括short、int、long和char,浮点类型包括float和double。以下是各种基本数据类型......
  • C++设计模式 之 Monostate模式
    目录标题第一章:Monostate模式简介什么是Monostate模式?Monostate模式的工作原理使用Monostate模式的优势适用场景第二章:实现Monostate模式基本结构构造函数和析构函数使用案例总结第三章:Monostate模式的优缺点优点缺点Monostate模式与单例模式的比较第四章:Monostate模......
  • C语言---动态内存管理
    1.为什么要有动态内存分配指针+结构体+动态内存管理是学习数据结构的非常重要的知识intmain(){intn=0;//向内存申请一块空间---一个整型4个字节intarr[10]={0};//向内存中申请一块连续的空间--10个整型--40个字节return0;}这两种但是上述......
  • c++中string的用法
    STL的简介一.什么是STL二.STL的六大组件2.1仿函数2.2空间配置器2.3算法2.4迭代器2.5容器2.6配置器三.string类3.1string类3.2string类的常用接口说明代码示例运行结果3.3string类对象的容量操作代码示例sizelengthcapcityemptyresizereverse3.4string类对象的访问......
  • C++拷贝构造函数、运算符重载函数、赋值运算符重载函数、前置++和后置++重载等的介绍
    文章目录前言一、拷贝构造函数1.概念2.特征3.编译器生成默认拷贝构造函数4.拷贝构造函数典型使用场景二、运算符重载函数三、赋值运算符重载函数1.赋值运算符重载格式2.赋值运算符只能重载成类的成员函数不能重载成全局函数3.编译器生成一个默认赋值运算符重载四......