"Managed" (编译类型)

"Managed"::[t]

代表一个将自动内存管理添加到 t 的复合类型.

更多信息

  • "Managed" 为类型添加内存管理,例如由外部库暴露的类型.
  • t 不能是已拥有自动内存管理的状态.
  • "Managed" 使用自动引用计数来自动释放不再使用的对象.
  • 从编译代码返回的托管对象继续由 Wolfram Language 内核进行内存管理.
  • 当作为参数传递给由 LibraryFunctionDeclaration 声明的函数时,托管对象会自动解包. »

函数构造

  • CreateTypeInstance["Managed"::[t],obj,freeFunc] 构造一个包含 obj 的托管对象,该对象可在 "Managed" 对象释放时执行 freeFunc[obj]. freeFunc 必须有类型签名 {t}"Null".
  • CreateTypeInstance["Managed"::[t],obj]DeleteObject 作为 freeFunc 使用.
  • 对于特定的 "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 语言数组在传递给库函数之前被借用并自动解包: