当前位置: 首页 > 面试题库 >

收集Go结构时,是否可以释放非托管资源?

赵立果
2023-03-14
问题内容

我有一个指向由Go结构包裹的C类型的指针,如下所示:

type Wrapper struct {
    unmanaged *C.my_c_type
}

C类型又具有以下功能:

my_c_type* make_c_type();
void free_c_type(my_c_type *ct);

有没有一种方法可以确保实例完成后立即free_c_type调用Wrapper


问题答案:

您可以使用runtime.SetFinalizer。当对象超出范围时,这使您可以运行清除功能。它不能保证运行。但是,释放内存时,这并不重要。重要的是,对于一个长时间运行的过程,很可能会检查垃圾。

以下是一些文档摘录(删除了整个段落):

SetFinalizer将与x关联的终结器设置为f。当垃圾收集器找到带有关联的终结器的无法访问的块时,它将清除该关联并在单独的goroutine中运行f(x)。这使得x再次可访问,但是现在没有关联的终结器。假设没有再次调用SetFinalizer,则下次垃圾回收器看到x不可达时,它将释放x。

x的终结器计划在x变得不可访问之后的任意时间运行。无法保证终结器会在程序退出之前运行,因此通常它们仅对在长时间运行的程序期间释放与对象关联的非内存资源有用。例如,当程序在不调用Close的情况下丢弃os.File时,os.File对象可以使用终结器关闭关联的操作系统文件描述符,但是依靠终结器来刷新内存I将是一个错误。
/ O缓冲区,例如bufio.Writer,因为该缓冲区不会在程序退出时刷新。

单个goroutine按顺序运行程序的所有终结器。如果终结器必须运行很长时间,则应通过启动新的goroutine来完成。



 类似资料:
  • 本文向大家介绍详解C# 托管资源和非托管资源,包括了详解C# 托管资源和非托管资源的使用技巧和注意事项,需要的朋友参考一下 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网

  • 问题内容: 我只是想检查是否有人知道使用PHP为基于Web的项目提供的任何托管连续集成服务? 我一直在搜索,但是大多数都是Java,Ruby和iOS / Android的。我将不得不使用Jenkin设置自己的CI服务器。我猜想在PHP方面对CI的需求不足以证明托管服务可以支持现成的服务。 问题答案: Quora上有托管的持续集成提供程序列表。 其中一些还支持PHP: circleci.com ua

  • 当我运行我的应用程序时,我收到一个错误。 应用程序结构 结构 pom.xml RestartApplication.java MvcConfig WebSecurityConfig 身份验证控制器(显示欢迎页面) 博客控制器 主控制器 注册控制器 邮政 角色 用户 后存储库 用户报告 我试图使用@EnableJpaRepositories和@EntityScan修复它,但这无济于事。在我的MySQ

  • 问题内容: 如果我要存储许多结构: 我可以用片来做,但是看起来使用更少的内存可以使用适当的set结构。 不幸的是,Go没有固定的结构。每个人都建议使用,但由于是结构,所以不起作用。有人有什么好的解决方案吗?理想情况下,无需下载库。 问题答案: 通常,设置和映射数据结构比将一组值存储在按设置的普通数组或切片中需要更多的内存,并且映射提供有效的附加功能,例如唯一性或通过键检索值。 如果要最小化内存使用

  • 我想使用此模式创建一个数据帧: 代码: 但是有一些。显示抛出: 错误执行器:阶段0.0(TID 0)java中任务0.0中出现异常。lang.RuntimeException:编码时出错:java。lang.RuntimeException:scala。收集不可变$冒号$冒号不是结构架构的有效外部类型 编辑: 513和549应该是子列名而不是值。这是我期望的输出示例:

  • 我正在使用JCUDA,想知道JNI对象是否足够聪明,可以在垃圾收集时解除分配?我能理解为什么这可能在所有情况下都不起作用,但我知道它会在我的情况下起作用,所以我的后续问题是:我如何才能完成这一点?有没有我可以设置的“模式”?我需要构建抽象层吗?或者答案真的是“不,永远不要尝试”,那么为什么不呢? 编辑:我只是指通过JNI创建的本机对象,而不是Java对象。我知道所有Java对象都被平等地对待,即垃