UnmanageObject[man]
管理されたオブジェクトにラップされたメモリの所有権を取得する.
UnmanageObject
UnmanageObject[man]
管理されたオブジェクトにラップされたメモリの所有権を取得する.
詳細
- man はManagedObjectまたはコンパイルされたコードの"Managed"型のオブジェクトである.
- コンパイルされたコードでは,UnmanageObjectは型シグネチャ {"Managed"::[t]}t を持つ.
- UnmanageObject[man]は管理されたオブジェクト man を変更可能に無効化する.コンパイルされたコードで無効化された後に man を再度使うとランタイムエラーになる.
- UnmanageObjectは,オブジェクトへの長期的な参照を保持する外部コードにオブジェクト渡す際に使うことができる.
例題
すべて開く すべて閉じる例 (2)
man = CreateManagedObject[foo, Echo]man["Active"]UnmanageObject[man]man["Active"]createManaged = FunctionCompile[Function[{},
CreateTypeInstance["Managed", 12, Function[obj, Null;]]
]]unmanage = FunctionCompile[Function[Typed[arg, "Managed"::["MachineInteger"]],
UnmanageObject[arg]
]]managed = createManaged[]上記オブジェクトの管理を止めると,もとのラップされた値が返される:
unmanage[managed]スコープ (3)
管理されたオブジェクトが参照されなくなると解放関数が評価される:
With[{man = CreateManagedObject[foo, Echo]}, Null]管理されたオブジェクトが管理されていなければ解放関数は評価されない:
With[{man = CreateManagedObject[foo, Echo]}, UnmanageObject[man];]管理されたオブジェクトはUnmanageObjectによって無効にされ,スコープの外に出ても解放されない.管理されていないオブジェクトを作成する関数をコンパイルする:
createManaged = FunctionCompile[Function[{},
CreateTypeInstance["Managed", 12, Function[obj, Echo["freed"];]]
]]unmanage = FunctionCompile[Function[Typed[arg, "Managed"::["MachineInteger"]],
UnmanageObject[arg]
]]Module[{obj}, obj = createManaged[];Echo["body"]];オブジェクトをスコープの外に出す前にこれを管理されなくする:
Module[{obj}, obj = createManaged[];unmanage[obj];Echo["body"]];管理されたオブジェクトを管理されなくすることでコンテンツを事実上借用し,その後それを含む新たな管理されたオブジェクトを作ることができる.管理対象のC配列を作るための関数をコンパイルする:
createManagedArray = FunctionCompile[Function[{},
CreateTypeInstance["Managed"::["CArray"::["MachineInteger"]], {1, 2, 3}]
]]C配列を管理対象ではなくし,変更し,再度管理対象にする関数をコンパイルする:
modifyManagedArray = FunctionCompile[Function[Typed[carr, "Managed"::["CArray"::["MachineInteger"]]],
Module[{unmanagedArr},
unmanagedArr = UnmanageObject[carr];
ToRawPointer[unmanagedArr, 0, 42];
CreateTypeInstance["Managed", unmanagedArr]
]
]]carr = createManagedArray[]carr2 = modifyManagedArray[carr]特性と関係 (2)
素のメモリを割り当てる関数は,通常,管理されたオブジェクトを返す:
ptr = RawMemoryAllocate["UnsignedInteger8", 10]rawPtr = UnmanageObject[ptr]RawMemoryWrite[rawPtr, 42]ポインタは管理されていないので,メモリが使われなくなったらRawMemoryFreeを呼ぶ:
RawMemoryFree[rawPtr]UnmanageObjectへの呼出しが不要になるように,LibraryFunctionDeclarationで宣言された関数で管理されたオブジェクトのラッパーを自動的にはずす:
dec = LibraryFunctionDeclaration["sumArray", "compilerDemoBase", {"CArray"::["CLong"], "CLong"} -> "CInt"];管理対象のC配列を借用し,ライブラリ関数に渡す前に自動的にラッパーをはずす:
cf = FunctionCompile[dec,
Function[Typed[arg, "ListVector"::["CLong"]],
Module[{carr},
carr = CreateTypeInstance["Managed"::["CArray"::["CLong"]], arg];
LibraryFunction["sumArray"][carr, Length[arg]]
]
]
]cf[Range[100]]考えられる問題 (1)
funcs = FunctionCompile[
<|
"create" -> Function[{},
CreateTypeInstance["Managed", 12, Function[obj, Null;]]
],
"unmanage" -> Function[Typed[arg, "Managed"::["MachineInteger"]],
UnmanageObject[arg]
]
|>]managed = funcs["create"][]funcs["unmanage"][managed]その後のUnmanageObjectの呼出しは,管理対象オブジェクトが管理解除されると無効化されるため,失敗する:
funcs["unmanage"][managed]テクニカルノート
-
▪
- 外部関数
関連するガイド
-
▪
- FFI
テキスト
Wolfram Research (2022), UnmanageObject, Wolfram言語関数, https://reference.wolfram.com/language/ref/UnmanageObject.html.
CMS
Wolfram Language. 2022. "UnmanageObject." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/ref/UnmanageObject.html.
APA
Wolfram Language. (2022). UnmanageObject. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/ref/UnmanageObject.html
BibTeX
@misc{reference.wolfram_2026_unmanageobject, author="Wolfram Research", title="{UnmanageObject}", year="2022", howpublished="\url{https://reference.wolfram.com/language/ref/UnmanageObject.html}", note=[Accessed: 03-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_unmanageobject, organization={Wolfram Research}, title={UnmanageObject}, year={2022}, url={https://reference.wolfram.com/language/ref/UnmanageObject.html}, note=[Accessed: 03-November-2026]}