FreeBASIC OpNew
目次→
演算子→
メモリ演算子→
Operator New Expression←オリジナル・サイト
動的にメモリを割り当てて、指定した型のデータを構築する、演算子
用法:
パラメタ:
datatype
作成するデータ型の名前。
initializers
変数のための初期値
count
割り当てる要素の、厳密な数
戻り値:
新しく割り当てられたデータへの、
datatype 型のポインタ。メモリの割り当てに失敗した場合は null ポインタ。
記述:
New 演算子は、メモリを動的に割り当て、指定されたデータ型を構築します。
整数などの単純型の場合は、初期値を指定できます。
構築子を持たない型の場合、初期値を各フィールドに指定できます。
(データ項目宣言時のデフォルト初期化子を使うか、またはすべての型データ項目が数値プリミティブのみで、デフォルト初期化子のない場合は New datatype (initializers, ..) のような初期化子リストを使います。)
少なくとも1つの構築子を持つ型の場合、初期化リスト(存在する場合)は既存の構築子と一致する必要があります。
初期化指定子が与えられていない場合は、それらの型のデフォルト値が設定されます。
New[] Expression 演算子は、New Expression 演算子の(1次元)配列バージョンであり、指定された数のオブジェクトに、十分なメモリを割り当てます。
型のデフォルト構築子を使って、各アイテムの初期値を設定します。
New Expression 演算子を使って作成されたオブジェクトは、
Delete Statement 演算子を使って、解放する必要があります。
New[] Expression 演算子を使って作成されたオブジェクト配列は、
Delete[] Statement 演算子、つまり
Delete Statement 演算子の配列バージョンを使って、解放する必要があります。
異なるバージョンの演算子を混在させることはできません。
New datatype[count] {Any} のように、
Any の初期値を指定すると、配列のメモリが割り当てられますが、データは初期化されません。
これは、構築子を持たないデータ型に対してのみ有効です。
そうでない、構築子を持つデータ型の場合、
Cptr(datatype Ptr, Allocate(count * Sizeof(datatype))) のような、ポインタ変換による単純なメモリ割り当ての構文は、New...Any の無効な使い方になります。
New datatype[count] 式で割り当てる、メモリの総量(バイト単位)は、
sizeof(datatype) * count、および暗黙的または明示的な
Destructor がある場合は
sizeof(uinteger) を加えて、計算されます。
バイト単位で割り当て要求された合計メモリは、
Uinteger が保持できる値をオーバーしてはいけません。
割り当てられた場合、余分な
uinteger は、要素の数を、割り当ての一部として格納するので、
Delete Statement は、呼び出すデストラクタの数を決定できます。
メモリの割り当てに失敗した場合は、null ポインタが返され、構築子は呼び出されません。
New Expression 演算子によって提供される動的メモリ割り当て処理部分は、メンバ演算子
New Overload としてユーザ定義型に対して多重定義できます。
データ構築のための続く処理部分は、決して修正することができません。
注意: pointer = New datatype[count] の使用は、
pointer が
datatype とは異なる型で宣言されている場合、安全ではありません(たとえば、サブタイプのポリモーフィズムを目的としている場合)。
ポインタ型のサイズが、データ型のサイズと異なる場合 (
Operator [] (Pointer index) を使ったり、ポインタにオフセット(要素番号)を追加したり、Delete []ステートメント(
Delete Statement の配列バージョン)自体が要素を破棄しなければならない場合でも)、ポインタ演算が、要素にアクセスできないためです。
例:
Type Rational
As Integer numerator, denominator
End Type
' "rational" を作成して初期化し、そのアドレスを保存します。
Dim p As Rational Ptr = New Rational(3, 4)
' null リターンポインタかどうかをテストします
If (p = 0) Then
Print "Error: unable to allocate memory"
Else
Print p->numerator & "/" & p->denominator
' "rational" を破棄し、そのメモリをシステムに戻します。
Delete p
End If
Sleep
Type Rational
As Integer numerator, denominator
End Type
Scope
' "rational" を生成して、初期化して、そのアドレスを格納します
Dim p As Rational Ptr = New Rational(3, 4)
' if null return pointer をテスト
If (p = 0) Then
Print "Error: unable to allocate memory, quitting."
End -1
End If
Print p->numerator & "/" & p->denominator
' rational を破壊して、そのメモリをシステムに戻します
Delete p
End Scope
Scope
' メモリを100 の整数に割り当てて、最初のもののアドレスを格納します
Dim p As Integer Ptr = New Integer[100]
' if null return pointer をテスト
If (p = 0) Then
Print "Error: unable to allocate memory, quitting."
End -1
End If
' 配列中の整数に、いくつかの値を割り当てます
For i As Integer = 0 To 99
p[i] = i
Next
' 整数配列全体を解放します
Delete[] p
End Scope
Sleep
' 100 個の整数にメモリを割り当て、最初の整数のアドレスを格納します。
Dim p As Integer Ptr = New Integer[100]
' null リターンポインタかどうかをテストします
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."
Sleep
examples/manual/operator/nested_new.bas
'' Example of nested New [] to get a 2-dimentional object array (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 [] allocation for the first dimension:
'' no internal allocation of extra uinteger because
'' allocation of array of pointers (to UDT objects with destructor)
For I As Integer = 0 To 3
p[I] = New UDT [5] '' New [] allocations for the last dimension:
'' internal allocation of an extra uinteger for each New [],
'' because allocation of an array of UDT objects with destructor
Print
Next I
For I As Integer = 0 To 3
For J As Integer = 0 To 4
p[I][J].N = I * 10 + J '' assignment of each object array element
Next J
Next I
Print
For I As Integer = 0 To 3
For J As Integer = 0 To 4
Print p[I][J].N, '' display of each object array element
Next J
Print
Next I
Print
For I As Integer = 0 To 3
Delete [] p[I] '' Delete [] deallocations for the last dimension
Print
Next I
Delete [] p '' Delete [] deallocation for the first dimension)
Print
Sleep
出力例:
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
方言差:
QBからの違い:
参照:
ページ歴史:2021-02-19 23:48:17
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall