c++--动态内存

news2024/11/6 19:31:10

目录

1.栈和堆的概念

1.1 new 运算符的使用

1.2 new 与 malloc() 的区别

1.3 代码示例(delete):释放内存


1.栈和堆的概念

栈 (Stack)

  • 栈内存 是一种自动分配的内存空间。函数内部声明的变量和函数调用都在栈上操作。当一个函数结束时,栈上的变量会自动释放。

  • 由于栈内存空间较小且有固定大小,栈上的内存分配和释放速度非常快。

  • 栈上的变量是编译时已知大小的,因此通常只适用于存储大小已知的局部变量。

堆 (Heap)

  • 堆内存 手动管理。使用 new 运算符,可以在堆上动态分配内存。它适用于需要在运行时决定大小的内存,例如动态数组或对象。

  • 堆内存需要手动释放,程序员需要在合适的时机调用 delete 来释放之前 new 分配的内存,以避免内存泄漏。

1.1 new 运算符的使用

new 运算符可以用于动态分配任何类型的数据:

malloc() 函数在 C 语言中就出现了,在 C++ 中仍然存在,但建议尽量不要使用 malloc() 函数。new 与 malloc() 函数相比,其主要的优点是,new 不只是分配了内存,它还创建了对象。

 

data-type* pointer = new data-type;

对于这段代码的解释:在这里,data-type 可以是内置类型或用户自定义类型new 运算符会返回分配的内存地址,指针会指向这块内存。

1.2 newmalloc() 的区别

  1. 构造函数new 会调用构造函数,而 malloc() 仅分配内存,不会调用构造函数。这意味着 new 在对象的动态内存分配上更安全、更方便。
  2. 类型安全new 返回的指针类型与分配的对象类型匹配,而 malloc() 返回 void* 指针,因此需要强制类型转换。
  3. 异常处理new 在分配失败时会抛出 std::bad_alloc 异常,而不是返回 NULL。因此可以使用 try...catch 语句捕获异常,而无需手动检查 NULL 值。

1.3 代码示例(delete):释放内存

以下代码分配一个 double 类型的内存空间并进行分配成功检查

#include <iostream>
#include <cstdlib> // exit() 函数需要

int main() {
    double* pvalue = NULL; // 将指针初始化为 NULL
    pvalue = new double;   // 为变量请求内存

    if (!pvalue) {         // 检查是否成功分配内存
        std::cout << "Error: out of memory." << std::endl;
        exit(1);           // 退出程序
    }

    *pvalue = 45.67;       // 使用动态分配的内存
    std::cout << "Value: " << *pvalue << std::endl;

    delete pvalue;         // 释放动态分配的内存
    pvalue = NULL;         // 将指针重置为 NULL
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234469.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

职场日常:多年的测试工程师如何继续在测试行业中砥砺前行

大家好&#xff0c;今天我们一起聊聊测试工程师在职业、在团队、在家庭中如何更好的做好角色。 作为一个工作了多年测试工作的大牛来说&#xff0c;从今天开始或许未来会因为各个方面的原因可能不在从事软件测试了&#xff0c;但是会继续总结过往的经验&#xff0c;从事这么多…

文件操作:Xml转Excel

1 添加依赖 Spire.Xls.jar <dependency><groupId>e-iceblue</groupId><artifactId>spire.xls</artifactId><version>5.3.3</version></dependency>2 代码使用 package cctd.controller;import com.spire.xls.FileFormat; im…

【Homework】【1--3】Learning resources for DQ Robotics in MATLAB

Learning resources for DQ Robotics in MATLAB Lesson 1 代码 % Step 2: Define the real numbers a1 and a2 a1 123; a2 321;% Step 3: Calculate and display a3 a1 a2 a3 a1 a2; disp([a3 (a1 a2) , num2str(a3)])% Step 4: Calculate and display a3 a1 * a2 a3…

「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目

本篇将带领你实现一个互动性十足的灯光控制小项目&#xff0c;用户可以通过点击按钮来控制灯光的开关。该项目将涉及状态管理、动态图片加载以及按钮交互&#xff0c;是学习鸿蒙应用开发的重要基础。 关键词 UI互动应用状态管理动态图片加载用户交互 一、功能说明 在这个灯光…

雷池社区版 7.1.0 LTS 发布了

LTS&#xff08;Long Term Support&#xff0c;长期支持版本&#xff09;是软件开发中的一个概念&#xff0c;表示该版本将获得较长时间的支持和更新&#xff0c;通常包含稳定性、性能改进和安全修复&#xff0c;但不包含频繁的新特性更新。 作为最受欢迎的社区waf&#xff0c…

七.numpy模块

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发&#xff0c;2005 年&#xff0c;Travis Oliphant…

RK3568平台开发系列讲解(内存篇)Linux 内存优化

🚀返回专栏总目录 文章目录 一、如何正确采集 Linux 内存可用空间二、系统内存优化参考步骤2.1、优化 Linux Kernel module 所占用的内存空间2.3、将 Wi-Fi built-in kernel2.4、优化 Linux 文件系统所占用的内存空间2.5、上层优化2.6、客户定制优化2.6.1、对具体客户的具体产…

Caffeine 手动策略缓存 put() 方法源码解析

BoundedLocalManualCache put() 方法源码解析 先看一下BoundedLocalManualCache的类图 com.github.benmanes.caffeine.cache.BoundedLocalCache中定义的BoundedLocalManualCache静态内部类。 static class BoundedLocalManualCache<K, V> implements LocalManualCache&…

猎板PCB2到10层数的科技进阶与应用解析

1. 单层板&#xff08;Single-sided PCB&#xff09; 定义&#xff1a;单层板是最基本的PCB类型&#xff0c;导线只出现在其中一面&#xff0c;因此被称为单面板。限制&#xff1a;由于只有一面可以布线&#xff0c;设计线路上有许多限制&#xff0c;不适合复杂电路。应用&…

Dinky中配置Flink集群

需要启动yarn-session 进程&#xff0c;在集群服务器 cd /pwd//flink/bin yarn-session -d 启动成功后可以在yarn的资源管理队列进行查看 启动成功后会给出&#xff1a;JobManager Web Interface 在dinky中进行配置&#xff1a; 集群配置 Hadoop 配置&#xff1a; H…

asp.net+uniapp养老助餐管理系统 微信小程序

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 以往流浪猫狗的救助网站相关信息的管理&#xff0c;都是工作人员手工统计。这种方式不但时效性低&#xff0c;而且需要查…

《Ooga》进不去游戏解决方法

Ooga如果遇到进不去游戏的情况&#xff0c;玩家可以采取很多种方法进行解决&#xff0c;其中包括检查设备配置与网络连接&#xff0c;验证游戏文件完整性以及清理游戏缓存。 Ooga进不去游戏怎么办 检查设备配置 确保电脑的配置达到了游戏的最低要求&#xff0c;如果配置不足&…

Kubernetes——part8-2 k8s集群存储解决方案 GlusterFS

一、存储解决方案介绍 1.1 GlusterFS GlusterFS是一个开源的分布式文件系统具有强大的横向扩展能力通过扩展能够支持数PB存储容量和处理数千客户端GlusterFS借助TCP/IP或InfiniBandRDMA网络将物理分布的存储资源聚集在一起&#xff0c;使用单一全局命名空间来管理数据。 1.2…

Kafka 之顺序消息

前言&#xff1a; 在分布式消息系统中&#xff0c;消息的顺序性是一个重要的问题&#xff0c;也是一个常见的业务场景&#xff0c;那 Kafka 作为一个高性能的分布式消息中间件&#xff0c;又是如何实现顺序消息的呢&#xff1f;本篇我们将对 Kafka 的顺序消息展开讨论。 Kafk…

js WebAPI黑马笔记(万字速通)

此笔记来自于黑马程序员&#xff0c;pink老师yyds 复习&#xff1a; splice() 方法用于添加或删除数组中的元素。 注意&#xff1a; 这种方法会改变原始数组。 删除数组&#xff1a; splice(起始位置&#xff0c; 删除的个数) 比如&#xff1a;1 let arr [red, green, b…

C 学习(5)

哈哈哈哈哈&#xff0c;终于想起来了&#xff01;贴一下主要的参考&#xff1a; 基本语法 - 《阮一峰《C 语言教程》》 - 书栈网 BookStack 内容写的比较浅显有疏漏&#xff0c;如果看不明白&#xff0c;再结合一下百度。 注释 C 语言的注释有两种表示方法。 第一种方法是…

redis7学习笔记

文章目录 1. 简介1.1 功能介绍1.1.1 分布式缓存1.1.2 内存存储和持久化(RDBAOF)1.1.3 高可用架构搭配1.1.4 缓存穿透、击穿、雪崩1.1.5 分布式锁1.1.6 队列 1.2 数据类型StringListHashSetZSetGEOHyperLogLogBitmapBitfieldStream 2. 命令2.1 通用命令copydeldumpexistsexpire …

【设计模式系列】建造者模式(十)

目录 一、什么是建造者模式 二、建造者模式的角色 三、建造者模式的典型应用 四、建造者模式在StringBuilder中的应用 五、典型建造者模式的案例 一、什么是建造者模式 建造者模式&#xff08;Builder Pattern&#xff09;是一种创建型设计模式&#xff0c;用于构建复杂对…

用vite创建项目

一. vite vue2 1. 全局安装 create-vite npm install -g create-vite 2. 创建项目 进入你想要创建项目的文件夹下 打开 CMD 用 JavaScript create-vite my-vue2-project --template vue 若用 TypeScript 则 create-vite my-vue2-project --template vue-ts 这里的 …

JVM结构图

JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成&#xff0c;包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统&#xff08;Class Loading Subsy…