Operator New Expression
- 来源: https://www.freebasic.net/wiki/wikka.php?wakka=KeyPgOpNew
- 最后更新: 2021-02-19
动态分配内存并构造指定类型数据的运算符。
用法
result = New datatype
or
result = New datatype ( initializers, ... )
or
result = New datatype[ count ]参数
datatype
要创建的数据类型名称。
initializers
变量的初始值。
count
要分配的确切元素数量。
返回值
指向新分配数据的 datatype 类型指针,如果内存分配失败则返回空指针。
描述
New Expression 运算符动态分配内存并构造指定的数据类型。
对于简单类型(如整数),可以给定初始值。对于没有构造函数的类型,可以为每个字段指定初始值(要么在数据字段声明时使用默认初始化器,要么使用初始化器列表,如 New datatype (initializers, ..) 前提是所有类型数据字段仅为数值基元类型且没有任何默认初始化器)。对于至少有一个构造函数的类型,初始化器列表(如果有)必须与现有的构造函数匹配。如果未给出初始化器,将为这些类型设置默认值。
New[] Expression 运算符是 New Expression 运算符的(一维)数组版本,为指定数量的对象分配足够的内存。将使用类型的默认构造函数为每个项设置初始值。
用 New Expression 运算符创建的对象必须用 Delete Statement 运算符释放。用 New[] Expression 运算符创建的对象数组必须用 Delete[] Statement 运算符(Delete Statement 运算符的数组版本)释放。不能混用不同版本的运算符。
将初始值指定为 Any,如 New datatype (Any) 将为类型分配内存,但不初始化数据。这只对没有构造函数的数据类型有效(否则对于有构造函数的数据类型,可以用简单内存分配加指针转换的语法替代,如 Cptr(datatype Ptr, Allocate(Sizeof(datatype))),以取代无效的 New...Any 用法)。
将初始值指定为 Any,如 New datatype[count] {Any} 将为数组分配内存,但不初始化数据。这只对没有构造函数的数据类型有效(否则对于有构造函数的数据类型,可以用简单内存分配加指针转换的语法替代,如 Cptr(datatype Ptr, Allocate(count * Sizeof(datatype))),以取代无效的 New...Any 用法)。
用 New datatype[count] 表达式分配的总内存(字节数)计算为 sizeof(datatype) * count,如果有隐式或显式 Destructor 则再加 sizeof(uinteger)。请求分配的总字节数不得溢出 Uinteger 所能容纳的值。额外的 uinteger(如果分配了)存储元素数量作为分配的一部分,这样 Delete Statement 就能确定要调用的析构函数数量。
如果内存分配失败,返回空指针并且不调用任何构造函数。
New Expression 运算符提供的动态内存分配过程部分可以作为成员运算符 New Overload 为用户定义类型重载。随后的数据构造过程部分永远不能被修改。
注意:如果 pointer 声明的类型与 datatype 不同(例如出于子类型多态目的),使用 pointer = New datatype[count] 可能不安全,因为如果指针类型大小与 datatype 的大小不同,指针算术将无法访问元素(使用 Operator [] (Pointer index) 或将偏移量(元素编号)添加到指针时,甚至 Delete[] Statement 本身(Delete Statement 的数组版本)在销毁元素时也是如此)。
示例
start GeSHi
Type Rational
As Integer numerator, denominator
End Type
' 创建并初始化一个 "rational",存储其地址。
Dim p As Rational Ptr = New Rational(3, 4)
' 测试是否返回空指针
If (p = 0) Then
Print "Error: unable to allocate memory"
Else
Print p->numerator & "/" & p->denominator
' 销毁 rational 并将内存归还给系统。
Delete p
End If
Sleepend GeSHi
start GeSHi
' 为 100 个整数分配内存并存储第一个的地址。
Dim p As Integer Ptr = New Integer[100]
' 测试是否返回空指针
If (p = 0) Then
Print "Error: unable to allocate memory"
Else
' 为数组中的整数赋值。
For i As Integer = 0 To 99
p[i] = i
Next
' 释放整个整数数组。
Delete[] p
End If
Print "Done."
Sleepend GeSHi
start GeSHi
'' 使用嵌套 New [] 获得二维对象数组(4*3)的示例
Type UDT
Dim As Integer N
Declare Constructor ()
Declare Destructor ()
End Type
Constructor UDT ()
Print "Constructor",
End Constructor
Destructor UDT ()
Print "Destructor",
End Destructor
Dim As UDT Ptr Ptr p = New UDT Ptr [4] '' 为第一维分配 New []:
'' 不分配额外 uinteger,因为
'' 分配的是指针数组(指向带析构函数的 UDT 对象)
For I As Integer = 0 To 3
p[I] = New UDT [5] '' 为最后一维分配 New []:
'' 每个 New [] 都内部分配一个额外 uinteger,
'' 因为分配的是带析构函数的 UDT 对象数组
Print
Next I
For I As Integer = 0 To 3
For J As Integer = 0 To 4
p[I][J].N = I * 10 + J '' 为每个对象数组元素赋值
Next J
Next I
Print
For I As Integer = 0 To 3
For J As Integer = 0 To 4
Print p[I][J].N, '' 显示每个对象数组元素
Next J
Print
Next I
Print
For I As Integer = 0 To 3
Delete [] p[I] '' 为最后一维执行 Delete [] 释放
Print
Next I
Delete [] p '' 为第一维执行 Delete [] 释放
Print
Sleepend GeSHi
输出示例:
Constructor Constructor Constructor Constructor Constructor
Constructor Constructor Constructor Constructor Constructor
Constructor Constructor Constructor Constructor Constructor
Constructor Constructor Constructor Constructor Constructor
0 1 2 3 4
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
Destructor Destructor Destructor Destructor Destructor
Destructor Destructor Destructor Destructor Destructor
Destructor Destructor Destructor Destructor Destructor
Destructor Destructor Destructor Destructor Destructor方言差异
- 仅在 -lang fb 方言中可用。
与 QB 的区别
- FreeBASIC 新增
参见
Delete StatementPlacement NewNew Overload
返回 目录