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}]
]]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]托管对象由使用 LibraryFunctionDeclaration 声明的函数自动解除封装,因此无需调用 UnmanageObject:
dec = LibraryFunctionDeclaration["sumArray", "compilerDemoBase", {"CArray"::["CLong"], "CLong"} -> "CInt"];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]技术笔记
相关指南
-
▪
- 外部函数接口
文本
Wolfram Research (2022),UnmanageObject,Wolfram 语言函数,https://reference.wolfram.com/language/ref/UnmanageObject.html.
CMS
Wolfram 语言. 2022. "UnmanageObject." Wolfram 语言与系统参考资料中心. Wolfram Research. https://reference.wolfram.com/language/ref/UnmanageObject.html.
APA
Wolfram 语言. (2022). UnmanageObject. Wolfram 语言与系统参考资料中心. 追溯自 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: 20-June-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: 20-June-2026]}