【Delphi 基础知识 15】手动管理内存的两种方法(New与Dispose)(GetMem与FreeMem)

New 和 Dispose 是在 Delphi 中用于动态分配和释放内存的两个关键字。

  1. New 关键字:

    New 关键字用于动态地分配内存以存储一个或多个对象。它的一般语法为:

    New(PointerVariable);
    

    其中,PointerVariable 是一个指向要分配内存的类型的指针。New 将分配足够的内存以存储指定类型的对象,并返回指向新分配内存的指针。

    // 例子:分配一个整数的内存
    varintPtr: PInteger;
    beginNew(intPtr);intPtr^ := 42; // 在分配的内存中存储整数值// 使用 intPtrDispose(intPtr); // 释放分配的内存
    end;
    
  2. Dispose 关键字:

    Dispose 关键字用于释放通过 New 分配的内存。它的语法为:

    Dispose(PointerVariable);
    

    其中,PointerVariable 是通过 New 分配内存的指针。Dispose 将释放之前通过 New 分配的内存,并将指针设置为 nil

    // 例子:释放之前分配的整数内存
    varintPtr: PInteger;
    beginNew(intPtr);intPtr^ := 42;// 使用 intPtrDispose(intPtr); // 释放分配的内存,并将 intPtr 设置为 nil
    end;
    
  3. GetMem 关键字:

    GetMem 过程用于动态地分配指定大小的内存块,并返回一个指向该内存块的指针。其基本语法如下:

    GetMem(PointerVariable, SizeInBytes);
    

    其中,PointerVariable 是一个指向分配内存的指针,SizeInBytes 是要分配的内存块的字节数。被分配的内存块是未初始化的。

    // 例子:分配一个包含 10 个整数的内存块
    varintArray: PInteger;
    beginGetMem(intArray, 10 * SizeOf(Integer));// 使用 intArray,注意此时内存块未初始化// ...FreeMem(intArray); // 释放分配的内存
    end;
    
  4. FreeMem 关键字:
    FreeMem 过程用于释放通过 GetMem 分配的内存。其基本语法如下:

    FreeMem(PointerVariable);
    

    其中,PointerVariable 是通过 GetMem 分配内存的指针。调用 FreeMem 会释放之前分配的内存,并将指针设置为 nil

    // 例子:释放之前分配的整数内存块
    varintArray: PInteger;
    beginGetMem(intArray, 10 * SizeOf(Integer));// 使用 intArray// ...FreeMem(intArray); // 释放分配的内存,并将 intArray 设置为 nil
    end;
    

    注意:在使用 FreeMem 释放内存后,要确保不再使用该指针,否则可能导致悬挂指针的问题。

那么着两种管理内存的方法有什么区别呢?

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

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

相关文章

通过 CMake 制作库文件 静态库 和 动态库

hehedalinux:~/Linux/loveDBTeacher-v2$ tree . ├── CMakeLists.txt ├── include │ └── head.h ├── main.c └── src├── add.c├── div.c├── mult.c└── sub.c CMake Calc 项目 在这里有add.c,div.c,mult.c,sub.c,main.c,head.h 二、生成静态库 …

填坑 3D gaussian splatting里SIBR_viewers的安装

SIBR_VIEWERS 上次写完太忙了,一直都没上CSDN。。 因为3DGS生成的模型要跑起来得用到GPU,所以一开始我就只能用它带的viewer,结果装了半天装不上,上篇文章评论里我看大家也遇到了吧。。 如果和我的原因一样的话,就很…

【数据结构】二叉树问题总结

目录 1.二叉树前序遍历,中序遍历和后序的实现 2.层序遍历 3.求二叉树中的节点个数 4.求二叉树中的叶子节点个数 5.求二叉树的高度 6.求二叉树第k层节点个数 7.二叉树查找值为x的节点 8.单值二叉树 9.二叉树最大深度 10.翻转二叉树 11. 检查两颗树是否相同…

NetDevOps:华三交换机通过Netmiko或者Nornir获取接口信息通过TextFSM解析报错问题

python代码:实现功能获取交换机接口信息并通过TextFSM进行解析。 from netmiko import Netmiko import textfsm show_intf_cmd_mapping {hp_comware: display interface, }def ssh_device_2_get_intfs(device_type, host, username, password, port):dev_info {d…

【2023年度回顾】让我们在新的一年继续努力前行

每当我们在努力的时候都会想:为什么我要努力?躺着不舒服吗? 大家好!我是命运之光,一名普普通通的计算机科学与技术专业的大三学生。 📕回顾一下整个2023年 因为我有每天发朋友圈的习惯,所以这一…

chromedriver 114以后版本下载地址

谷歌浏览器版本经常会升级,chromedriver 也得下载匹配的版本 chromedriver 114以前版本下载地址https://registry.npmmirror.com/binary.html?pathchromedriver/ 找到匹配浏览器版本 查看自己浏览器版本号v120.0 v120.0版本chromedriver下载地址https://google…

Ubuntu 22.04 安装prometheus

服务器监控和报警软件有很多,为什么我们会选择Prometheus而不是其他软件呢? 因为它有以下优点: 自带简易web监控页面,用户可以很方便地查看监控数据和使用仪表盘。能实时收集数据并根据自定义警报规则推送告警;具有丰…

Java SPI在数据库驱动、SpringBoot自动装配中的应用

文章目录 1. 初识SPI1.1 SPI的作用1.2 SPI的工作原理1.3 SPI的三个组件:Service、Service Provider、ServiceLoader1.4 SPI使用场景1.5 具体的SPI 源码分析(SPI的核心就是ServiceLoader.load()方法)1.6 SPI 的优缺点 2. API、SPI、JNDI释义3.…

uniapp滑动页面切换和下拉刷新,触底加载更多(swiper + scroll-view)

因为官方文档乱七八糟的,所以自己来总结下 需求: 常见的上方tag标签切换,下方是页面,上面点击切换,下面页面也切换,下方列表有下拉刷新,触底加载更多 因为这两个组件都是固定高度的,…

回顾2023 | 职业分析与计算机方向的选择、发展

文章目录 职业分析与计算机方向的选择、发展一:编程学习解读与职业分析1.编程的学习阶段:(1)入门阶段(2)熟悉阶段(3)学到什么程度才叫精通呢? 2.职业分析(1&a…

6.2 声音编辑工具GoldWave5简介(6)

3.选择【选项】|【控制器属性】命名或单击“控制器”面板上的“设置控制器属性”按钮,打开“控制器属性”对话框,将“音量”选项卡中的“麦克风”选项打上勾,使GoldWave只能录制来自麦克风的声音。如果要录制电脑内部的声音&#…

ARM动态Trustzone技术简介

目录 动态 TrustZone 典型的安全媒体路径 Arm 安全和架构特性 安全虚拟化 Realm Management Extensio

聊天机器人之接收实时信息实现(二)

准备工作 如果没有准备好环境的请看 前期环境准备 这里默认已经注入成功并且已经登录好了账号。 具体实现 实现原理 通过本地搭建一个web服务,来接收一个POST请求,这个请求中就会涵盖实时的数据,包括昵称、消息内容、消息类型之类的。 p…

边缘计算中的数据安全与隐私保护:挑战与应对策略

边缘计算 一、边缘计算中的数据安全与隐私保护问题二、应对策略三、安全与隐私保护框架四、总结与展望 随着边缘计算的快速发展,数据安全与隐私保护问题已经成为了一个亟待解决的问题。边缘计算将数据处理和分析的任务从中心化的数据中心转移到了设备端,…

Head First Design Patterns -工厂模式

什么是工厂模式 工厂方法模式定义了一个创建对象的接口,但由子类来决定要实例化那个类。工厂方法让类把实例化推迟到了子类。 为什么要有工厂模式 书中以pizza店制作pizza为例子,假设不用工厂模式,在制作pizza阶段我们需要这样去实例化类&am…

ubuntu22.04 安装gazebo遇到的坑(无法打开显示界面)

1.终端输入gazebo,无报错,也无显示界面 解决方法:应用中找到system monitor,找到gzserver,右键kill 2.安装软件包遇到的错误:dpkg: error processing archive /var/cache/apt/archives/libignition-utils1-dev_1.5.1…

回声状态网络(Echo State Networks,ESN)详细原理讲解及Python代码实现

回声状态网络(Echo State Networks,ESN)详细讲解及Python代码实现 1 基本概念 回声状态网络是一种循环神经网络。ESN 训练方式与传统 RNN 不同。网络结构如下图: (1)储层(Reservoir)&#x…

P2383 狗哥玩木棒 约翰玩木棒

P2383 狗哥玩木棒 约翰玩木棒 题目背景 狗哥又趁着语文课干些无聊的事了… 题目描述 现给出一些木棒长度,那么狗哥能否用给出的木棒(木棒全用完)组成一个正方形呢? 输入格式: 输入文件中的第一行是一个整数n表示测…

R语言【paleobioDB】——pbdb_collections_geo():从PBDB获取根据地理位置信息筛选的采集号的基本信息

Package paleobioDB version 0.7.0 paleobioDB 包在2020年已经停止更新,该包依赖PBDB v1 API。 可以选择在Index of /src/contrib/Archive/paleobioDB (r-project.org)下载安装包后,执行本地安装。 Usage pbdb_collections_geo (...) Arguments 参数【…

uniapp中u-switch子组件点击触发到父组件(阻止事件冒泡)

解决方法&#xff1a;在u-switch 外面包和view标签&#xff0c;并使用tap.stop.prevent 可以阻止事件冒泡 .stop 阻止事件继续传播到父元素&#xff0c;prevent阻止事件默认行为 <view tap.stop.prevent><u-switch v-model"val_switch" change"chang…