首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boehm-gc :终结器,并缩小到适合堆。

boehm-gc :终结器,并缩小到适合堆。
EN

Stack Overflow用户
提问于 2013-12-22 06:40:28
回答 1查看 530关注 0票数 1

我有两个关于boehm-gc的问题。

  1. 当GC收集垃圾对象时,尽管对象有析构函数,但GC释放内存而不调用析构函数。我发现GC呼叫"finailzer",但我不知道怎么注册.我该怎么做?
  2. 当GC收集垃圾时,GC似乎没有调用空闲()(或其他内存空闲函数)。似乎GC不释放垃圾,但将其放入GC的内存池并在下一次分配时使用池。GC在空闲时间释放内存池?如果没有,我可以对GC说“请释放内存池”吗?

PS。我找不到boehm-gc的参考资料..。你能告诉我推荐信在哪里吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-22 07:33:48

如果您需要比gc.h头文件中提供的引用更多的引用,那么在进一步研究之前,您可能应该阅读垃圾收集器。

如果您有疑问,gc.h头就有您需要的内容:

代码语言:javascript
运行
复制
typedef void (*GC_finalization_proc)
  GC_PROTO((GC_PTR obj, GC_PTR client_data));

GC_API void GC_register_finalizer
    GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
      GC_finalization_proc *ofn, GC_PTR *ocd));
GC_API void GC_debug_register_finalizer
    GC_PROTO((GC_PTR obj, GC_finalization_proc fn, GC_PTR cd,
      GC_finalization_proc *ofn, GC_PTR *ocd));
/* When obj is no longer accessible, invoke     */
/* (*fn)(obj, cd).  If a and b are inaccessible, and    */
/* a points to b (after disappearing links have been    */
/* made to disappear), then only a will be      */
/* finalized.  (If this does not create any new     */
/* pointers to b, then b will be finalized after the    */
/* next collection.)  Any finalizable object that   */
/* is reachable from itself by following one or more    */
/* pointers will not be finalized (or collected).   */
/* Thus cycles involving finalizable objects should */
/* be avoided, or broken by disappearing links.     */
/* All but the last finalizer registered for an object  */
/* is ignored.                      */
/* Finalization may be removed by passing 0 as fn.  */
/* Finalizers are implicitly unregistered just before   */
/* they are invoked.                    */
/* The old finalizer and client data are stored in  */
/* *ofn and *ocd.                   */ 
/* Fn is never invoked on an accessible object,     */
/* provided hidden pointers are converted to real   */
/* pointers only if the allocation lock is held, and    */
/* such conversions are not performed by finalization   */
/* routines.                        */
/* If GC_register_finalizer is aborted as a result of   */
/* a signal, the object may be left with no     */
/* finalization, even if neither the old nor new    */
/* finalizer were NULL.                 */
/* Obj should be the nonNULL starting address of an     */
/* object allocated by GC_malloc or friends.        */
/* Note that any garbage collectable object referenced  */
/* by cd will be considered accessible until the    */
/* finalizer is invoked.                */

所以你定义了一个回调:

代码语言:javascript
运行
复制
typedef <any type at all you want passed to the callback
         as data for its own use> MY_ENVIRONMENT;

void my_callback(GC_PTR void_obj, GC_PTR void_environment) {
  MY_ENVIRONMENT *env = (MY_ENVIRONMENT)void_environment;
  MY_OBJECT *obj = (MY_OBJECT*)void_obj;

  // Do finalization here.
}

创建它的环境(如果有的话;否则只需传递空):

代码语言:javascript
运行
复制
MY_ENVIRONMENT *my_env = new MY_ENVIRONMENT;
// Initialize if necessary.

然后在新分配的对象上注册它:

代码语言:javascript
运行
复制
MY_
MY_ENVIRONMENT old_env;
GC_finalization_proc old_proc;
GC_register_finalizer(new_obj, my_callback, my_env, &old_env, &old_proc);

现在,在收集此特定对象时,将使用您的环境记录调用my_callback

至于你的第二个问题,你漏掉了重点。Boehm GC取代malloc/new和free,并管理自己的内存领域。通常情况下,它自己决定何时做一个集合。这是典型的情况下,大部分竞技场已经用尽。垃圾收集标识空闲的块,因此有资格重新分配。正如API注释明确指出的那样,您可以强制集合和强制对象,但这些对象通常不是必需的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20726948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档