首页 > 其他分享 >Mojo 不安全指针 详解

Mojo 不安全指针 详解

时间:2024-08-05 21:25:41浏览次数:19  
标签:初始化 指向 Mojo UnsafePointer 详解 内存 ptr 指针

UnsafePointer类型创建对内存中某个位置的间接引用。您可以使用UnsafePointer来动态分配和释放内存,或指向由其他代码分配的内存。您可以使用这些指针编写与低级接口交互的代码,与其他编程语言交互,或构建某些类型的数据结构。但顾名思义,它们本质上是不安全的。例如,当使用不安全指针时,您有责任确保正确分配和释放内存。

除了不安全指针之外,Mojo 还支持安全 Reference类型。

什么是指针?


UnsafePointer是一种保存内存地址的类型。您可以在该内存中存储和检索值。UnsafePointer类型是泛型的,它可以指向任何类型的值,值的类型作为参数指定。指针所指向的值有时称为指针。

from memory.unsafe_pointer import UnsafePointer, initialize_pointee_copy, initialize_pointee_move

# Allocate memory to hold a value 分配内存以保存值
var ptr = UnsafePointer[Int].alloc(1)
# Initialize the allocated memory 初始化分配的内存
initialize_pointee_copy(ptr, 100)

在这里插入图片描述
图1所示。指针和指针数据

访问内存(检索或更新值)称为对指针进行解引用。你可以通过在变量名后面加一对空方括号来解引用指针:

# Update an initialized value
ptr[] += 10
# Access an initialized value
print(ptr[])

输出:

110

指针的生命周期


在任何给定时间,指针可以处于以下几种状态之一:

  • 未初始化。与任何变量一样,类型的变量UnsafePointer可以声明但未初始化。
var ptr: UnsafePointer[Int]
  • 空。空指针的地址为 0,表示无效指针。
ptr = UnsafePointer[Int]()
  • 指向已分配的、未初始化的内存。此alloc()静态方法返回一个指向新分配的内存块的指针,该内存块具有指定数量的指针类型元素的空间。
ptr = UnsafePointer[Int].alloc(1)

尝试取消引用指向未初始化内存的指针会导致未定义的行为。

  • 指向已初始化的内存。您可以通过将现有值移动或复制到内存中来初始化已分配的未初始化指针。或者,您可以使用address_of()静态方法获取指向现有值的指针。
initialize_pointee_copy(ptr, value)
# or
initalize_pointee_move(ptr, value^)
# or 
ptr = UnsafePointer[Int].address_of(value)

一旦初始化该值,您就可以使用取消引用语法读取或改变它:

oldValue = ptr[]
ptr[] = newValue
  • 悬空。释放指针分配的内存后,将剩下一个 悬空指针。地址仍指向其先前的位置,但内存不再分配给此指针。尝试取消引用指针或调用任何访问内存位置的方法都会导致未定义的行为。
ptr.free()

下图展示了的生命周期UnsafePointer:
在这里插入图片描述
图 2 .UnsafePointer

分配内存


使用静态alloc()方法分配内存。该方法返回指向所请求内存的新指针。您可以为指向对象的一个​​或多个类型值分配空间。

ptr = UnsafePointer[Int].alloc(10

标签:初始化,指向,Mojo,UnsafePointer,详解,内存,ptr,指针
From: https://blog.csdn.net/j610152753/article/details/140903287

相关文章

  • kubernetes-存储卷与持久化详解
    目录背景volume介绍emptyDirHostPathNFSconfigMapSecretPersistentVolume介绍PV回收策略PV访问策略基于nfs或nas创建pv创建hostpath类型的pvPV的状态PersistentVolumeClaim创建pvc与pv进行绑定使用pvc动态存储storageclass创建目录nfs添加授权目录创建yaml背景容器部署过程中一......
  • VulnhubJANGOW靶机详解
    项目地址https://www.vulnhub.com/entry/jangow-101754/部分vmware有配置问题,需要修改网卡信息,重启dhcp服务1.在系统启动时(长按shift键)直到显示以下界面选择第二个,按回车继续选择第二个2.按e进入编辑,进入以下界面删除"recoverynomodeset"并在末尾添加"quiets......
  • linux运维一天一个shell命令之vim详解
    前言:在日常运维工作中,掌握好Vim的使用可以极大地提高工作的效率。Vim作为一个强大的文本编辑器,广泛应用于各种运维场景一、定义Vim是一个非常强大的文本编辑器,在Unix/Linux环境中非常流行。它具有许多高级功能和快捷键,适合编写代码、编辑配置文件等。1、特点:高级......
  • iOS订阅详解
    1.进入管理后台点击订阅、然后新建一个组2.然后往组里面添加数据、可以编辑组里面订阅服务的等级、1代表最高等级、拖动可以改变相应的等级、无法自己指定等级、系统会根据拖动自动生成等级升级用户切换为更高等级的订阅。用户需先支付更高等级的订阅费用,支付成功后,订......
  • 深⼊理解指针(4)
    1.回调函数是什么?2.qsort使⽤举例3.qsort函数的模拟实现1.回调函数是什么?1.回调函数是什么?回调函数就是⼀个通过函数指针调⽤的函数。如果你把函数的指针(地址)作为参数传递给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数时,被调⽤的函数就是回调函数。回调函数不是......
  • 公网域名流量禁用详解
    公网域名流量禁用是一个涉及网络安全和流量管理的复杂操作,它通常需要根据具体的网络环境和业务需求来实施。以下是一些可能的步骤和考虑因素:一、明确禁用目标首先,需要明确禁用公网域名流量的具体目标。这可能包括:阻止未经授权的访问。防止恶意流量攻击,如DDoS攻击。节约带宽......
  • Tomcat与Nginx的区别详解
    目录引言Tomcat概述Tomcat的历史Tomcat的架构Tomcat的功能Nginx概述Nginx的历史Nginx的架构Nginx的功能Tomcat与Nginx的区别架构上的区别......
  • 【Python&GIS】Arcpy中常用出图函数详解
        出图是每个GISer都要经历的事,但有时候会有许多重复且多且无聊的出图任务,这个时候我们肯定想能不能自动化出图。ArcGIS中的模型创建就可以实现,但是我的数据大部分是在Python中处理的,所以就想能不能使用Python进行批量出图,正好今天跟大家分享一下。这里使用的mxd作为......
  • Modbus RTU与Modbus TCP协议区别详解
    工业自动化领域中,设备之间的数据传输至关重要,而Modbus协议作为一种通信标准,被广泛应用于各类自动化系统。而Modbus协议有两种常见的变体:ModbusRTU和ModbusTCP,下面本文将详细探讨这两种协议的区别。物理层ModbusRTU采用串行通信方式,利用RS-232或RS-485接口进行数据传输。它......
  • torch.nn.Linear的维度变换过程详解(有图有公式有代码)
    当初在学习nn.Linear时了解到的博客都是关于一维变换的,比如输入3通道,输出6通道;又比如得到(3,4,4)的特征图,需要进行拉平为(48,)的向量,然后通过nn.Linear(48,10)得到10个输出(分类任务很常见)。nn.Linear除了可以进行分类,主要的作用就是改变维度便于下一个卷积层或线形层的输入。但是在实......