"Managed" (コンパイルタイプ)

"Managed"::[t]

自動メモリ管理を t に加える複合型を表す.

詳細

  • "Managed"は外部ライブラリによって見せられる型等にメモリ管理を加える.
  • t はすでに自動メモリ管理を持っていることはない.
  • "Managed"はもう使用されないオブジェクトを自動的に解放するために自動参照カウントを使う.
  • コンパイルされたコードから返された管理されたオブジェクトは,引き続きWolfram言語カーネルによってメモリ管理される.
  • 管理されたオブジェクトはLibraryFunctionDeclarationによって宣言された関数の引数として渡されるとき,自動的にアンラップされる. »

コンストラクタ

  • CreateTypeInstance["Managed"::[t],obj,freeFunc]obj を含む管理されたオブジェクトを構築する.これは"Managed"オブジェクトが解放されるときにfreeFunc[obj]を実行する.freeFunc の型シグネチャは{t}"Null"でなければならない.
  • CreateTypeInstance["Managed"::[t],obj]freeFunc としてDeleteObjectを使う.
  • 特定の"Managed"::[t]型のコンストラクタは多数あり,コンパイル型 t のページに文書化されている.例えば,"Managed"::["CString"]のコンストラクタは"CString"で述べられている.

特性

  • "Managed"::[t]manInformation[man,"BaseType"]"TypeSpecifier"::[t]を与える.
  • UnmanageObjectは管理されたオブジェクトをアンラップして無効化し,ラップされたオブジェクトの所有権を取る.

変換

  • "Managed"オブジェクトはメモリ管理された式に変換される.式が解放されると,もとの管理されたオブジェクトの解放式が実行される.

ランタイムエラー

    InvalidManaged

  • 管理されていたオブジェクトを,UnmanageObjectで管理されなくなった後に使うとランタイムエラーが生じることがある.

例題

すべて開くすべて閉じる

  (2)

管理された"CString"オブジェクトを返すプログラムをコンパイルする:

ラップされた"CString"は,管理されたオブジェクトが範囲外になると自動的に解放される:

解放されたときに出力する,管理されたオブジェクトを返す関数をコンパイルする:

管理されたオブジェクトを作成し,範囲外に渡す:

スコープ  (4)

管理されたオブジェクトはコンパイルされたコードでメモリ管理される:

管理されたオブジェクトのコンテンツにはUnmanageObjectでアクセスすることができる:

管理されたオブジェクトを作成する:

UnmanageObjectでコンテンツを抽出する:

UnmanageObjectは管理されたオブジェクトを無効にするので,その後のUnmanageObjectの呼出しは失敗する:

以前は管理されていなかった管理されたオブジェクトは自動的に解放されない.管理されたオブジェクトを作成し,管理されなくする関数をコンパイルする:

管理されたオブジェクトを作成し,範囲外に渡す:

範囲外に渡す前にオブジェクトの管理を外す:

引数として管理されないC配列を取る関数を表す:

管理されたC配列が借用され,ライブラリ関数に渡される前に自動的にアンラップされる: