目次→
演算子→
メモリ演算子→
Operator Placement New←オリジナル・サイト
指定されたメモリ・アドレスで、オブジェクトを組み立てる、演算子。
構文:
result = New(address) datatype
or
result = New(address) datatype ( initializers, ... )
or
result = New(address) datatype[ count ]
パラメタ:
address
構築するメモリの場所。丸括弧 () は必須です。
initializers
変数のための、初期値
datatype
作成するデータ型の名前。
count
構成する要素の数。
戻り値:
記述:
配置 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 演算子とは異なり)、ユーザー定義型に対するメンバー演算子による多重定義を許可しません。
注意:
pointer が
datatype と異なる型で宣言されている場合(たとえば、サブタイプのポリモーフィズムを目的としている場合)、
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からの違い:
参照: