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

FreeBASIC OpPlacementNew

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

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


指定されたメモリ・アドレスで、オブジェクトを組み立てる、演算子。

構文:
result = New(address) datatype
or
result = New(address) datatype ( initializers, ... )
or
result = New(address) datatype[ count ]

パラメタ:
address
構築するメモリの場所。丸括弧 () は必須です。
initializers
変数のための、初期値
datatype
作成するデータ型の名前。
count
構成する要素の数。

戻り値:
新たに構成されたデータへの、型 datatype のポインタ。

記述:
配置 New 演算子は、指定された記憶域で、指定されたデータ型を構成します。

整数などの単純型の場合は、初期値を指定できます。
constructor を持たない型の場合、初期値を各フィールドに指定できます。(データフィールド宣言時のデフォルト初期化子、あるいは、すべての型データフィールドが数値プリミティブのみでデフォルト初期化子のない場合は New datatype (initializers, ..) のような初期化子リスト、のいずれか。)
少なくとも1つのコンストラクタを持つ型の場合、初期化リスト(存在する場合)は既存のコンストラクタと一致する必要があります。
初期化指定子が与えられていない場合は、それらの型のデフォルト値が設定されます。

配置 New 演算子を使うとき、メモリは割り当てられません
代わりに、指定された address のメモリが使われます。(指定されたメモリ・サイズは、すべての配置を格納するのに十分な大きさでなければなりません)。
アドレスに Delete Statement を呼ぶのは、間違いです。(こうすると、メモリは、解放されてしまいます。)
適切な方法は、destructor が存在する場合(暗黙的でも明示的でも)、メンバー・アクセス演算子を使って、メンバー・メソッドに関する構文で、単に 破壊子 を呼ぶことです。
適切な 配置 new 演算子の使用法については、以下の例を参照してください。

Placement New[] 演算子は、Placement New 演算子の(1次元の)配列バージョンであり、指定されたメモリ位置から、指定された数のオブジェクトを構築します。
型のデフォルト構築子を使って、各アイテムの初期値を設定します。

New(address)datatype(Any) または New(address)datatype[count]{Any} の場合のように、Any の初期値を指定することは、データを初期化しません。
これは、構築子を持っていないデータ型だけで有効です。
一方、構築子を持っているデータ型のために、単純なポインター変換(Cptr(datatype Ptr, address) など)の構文は、無効な New...Any の使用に代替できます。

動的メモリ割り当てプロセスは提供されないため、Placement New 演算子は( New Expression 演算子とは異なり)、ユーザー定義型に対するメンバー演算子による多重定義を許可しません。

注意: pointerdatatype と異なる型で宣言されている場合(たとえば、サブタイプのポリモーフィズムを目的としている場合)、pointer = New(address)datatype[count] の使用は安全ではありません。
ポインタ型のサイズが datatype のサイズと異なる場合、ポインタ演算は要素にアクセスできないからです。( Operator [] (Pointer index) を使用するか、ポインタにオフセット(要素番号)を追加する場合。)

例:
'' "配置 new" の例

Type Rational
    As Integer    numerator, denominator
    Declare Constructor ( ByVal n As Integer, ByVal d As Integer )
    As String ratio = "/"
End Type

Constructor Rational ( ByVal n As Integer, ByVal d As Integer )
    This.numerator = n
    This.denominator = d
End Constructor

Scope
   
    '' メモリを、Rational として構成するために割り当てます
    Dim As Any Ptr ap = CAllocate(Len(Rational))
   
    '' 配置 new を呼びます
    Dim As Rational Ptr r = New (ap) Rational( 3, 4 )
   
    '' アドレスは同じで、コンパイラで異なった型があるだけです
    Print ap, r
   
    '' すべてがオーケーであることを確認します
    Print r->numerator & r->ratio & r->denominator
   
    '' placement new とともに Delete Statement を使ってはいけません
    '' destructor が、暗黙的でも明示的でも存在するなら、破壊を明示的に行います
    ''   (この例では、var-string メンバーは、黙示的な destructor を誘導します)
    r->destructor( )
   
    '' 明示的に割り当てたので、明示的に割り当て解除します
    Deallocate( ap )
   
End Scope


方言差:

QBからの違い:

参照:
メモリ演算子 に戻る
演算子 に戻る
←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2019-05-03 01:40:59
日本語翻訳:WATANABE Makoto、原文著作者:JeffMarshall

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

表示-非営利-継承