FreeBASIC マニュアルのトップに戻る

FreeBASIC OpNew

目次演算子メモリ演算子Operator New Expression←オリジナル・サイト

演算子 New 式 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい


動的にメモリを割り当てて、指定した型のデータを構築する、演算子

用法:
result = New datatype
or
result = New datatype ( initializers, ... )
or
result = New datatype[ count ]

パラメタ:
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] の使用は、pointerdatatype とは異なる型で宣言されている場合、安全ではありません(たとえば、サブタイプのポリモーフィズムを目的としている場合)。 ポインタ型のサイズが、データ型のサイズと異なる場合 ( 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

ホームページのトップに戻る

表示-非営利-継承