【发布时间】:2012-05-15 20:56:09
【问题描述】:
阅读它here。
我需要实现这样一个接口的变体,假设我们有很大的内存空间来管理应该有 getmem(size) 和 free(pointer to block) 函数必须确保 free(pointer to block)当且仅当所有使用该块的进程都使用它时,才能真正释放内存。
我正在考虑做的是将Collectable 结构定义为指向块的指针,它的大小以及使用它的进程计数。然后,每当一个进程第一次使用 Collectable 结构实例时,它必须显式增加计数,并且每当进程 free() 使用它时,计数就会减少。
这种方法的问题是所有进程都必须响应该接口并使其显式工作:每当将可收集指针分配给实例时,该进程必须显式地包含该计数器,这不满足我,我在想也许有一种方法来创建一个宏以在每个分配中隐含地发生这种情况?
我正在寻找解决这个问题的方法一段时间,所以其他方法和想法会很棒......
编辑: 上述方法不能满足我,不仅因为它看起来不好看,而且主要是因为我不能假设正在运行的进程的代码会关心更新我的计数。我需要一种方法来确保它在不更改进程代码的情况下完成......
【问题讨论】:
-
必须检测每个指针副本这一事实并不是“这种方法的问题”:这是引用计数的基本问题。
-
我什至不确定你是否可以在 C 中实现引用计数。在 C++ 中,你有构造函数和析构函数,它们允许代码“自动”而不需要程序员额外的努力。
-
其他语言无关紧要,我对 Java 及其 GC 非常熟悉,所以我知道在这种情况下有更好的语言可以使用,但我的硬件还是要在 C 中实现这个想法。所以不要再给我使用不同的语言参数了。
-
有人可能会说,Objective C 命名约定加上手动保留/释放调用是在 C 中实现引用计数的一个示例(或非常接近的方法)。
-
@MikeBantegui:绝对可以,只是需要程序员付出更多的努力。
标签: c memory-management concurrency garbage-collection