- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个关于 boehm-gc 的问题。
GC 回收垃圾对象时,即使对象有析构函数,GC 也会释放内存而不调用析构函数。我发现 GC 调用“finailzer”,但我不知道如何注册它...我该怎么办?
当 GC 收集垃圾时,GC 似乎不会调用 free()(或其他内存释放函数)。好像GC并没有free garbage,而是放到GC的内存池中,下次分配时使用pool。 GC空闲时释放内存池?如果没有,我可以对 GC 说“请释放内存池”吗?
附言。我找不到 boehm-gc 引用..你能告诉我引用在哪里吗?
最佳答案
如果您需要比 gc.h
头文件中提供更多的引用,那么您可能应该在继续之前先阅读垃圾收集器。
关于你的问题,gc.h
header 有你需要的:
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. */
所以你定义了一个回调:
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.
}
创建它的环境(如果有的话;否则只传递 NULL):
MY_ENVIRONMENT *my_env = new MY_ENVIRONMENT;
// Initialize if necessary.
然后将它注册到一个新分配的对象上:
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
将在收集此特定对象时调用您的环境记录。
关于您的问题 2,您没有捕获重点。 Boehm GC 替换 malloc/new 和 free 并管理自己的内存区域。它通常自行决定何时进行收集。这通常是在大部分竞技场已用完时。垃圾收集识别空闲的 block ,因此有资格重新分配。作为API notes明确地说,您可以强制收集和强制收集对象,但这些通常不是必需的。
关于c++ - boehm-gc : finalizer, 并缩小以适应堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20726948/
我在 Mono 的网页上看到他们在精确模式下使用 Boehm GC。我也将 Boehm GC 与 C++ 一起使用,但是,我在其文档或 header 中找不到任何指示精确模式的内容,更不用说如何打开它
我检查了 Boehm GC。 C/C++ 的 GC。 我知道标记清除算法。我很好奇的是它如何在整个 C 内存中只获取指针。我对C内存的理解只是一个普通的字节数组。是否可以确定内存中的值是否为指针? 最
我很好奇有没有大型项目使用过Boehm GC?我特别感兴趣的是是否有任何游戏项目使用了这个垃圾收集器。如果不是,Boehm GC 是否对游戏项目不利? 令我印象深刻的是像这个 Boehm GC 这样的
标记指针是实现动态语言时常见的优化:利用对齐要求,这意味着指针的低两位或三位将始终为零,并使用它们来存储类型信息。 假设您正在使用 Boehm 垃圾收集器,它的工作原理基本上是查看事件数据以查找看起来
我正在阅读论文“不合作环境中的垃圾收集器”,想知道实现它会有多困难。该论文描述了需要从处理器收集所有地址(除了堆栈)。堆栈部分看起来很直观。除了在汇编中显式枚举每个寄存器之外,还有什么方法可以从寄存器
我读过 article in LinuxJournal关于Boehm-Demers-Weiser garbage collector library .我很感兴趣在我的库中使用它而不是我自己的引用计数
我正在尝试写一些 bindings到用于 Rust 的 Boehm GC。 一些背景:Rust 被设计成一种高并发语言,这种设计的结果是能够将 GC 指针静态限制在分配它们的线程内(即,分配在线程 x
我想在 Linux/AMD64/Debian 上使用 GCC 开发一个多线程 C++ 应用程序(最终大部分 C++ 代码将由应用程序本身生成,这可以被视为一种高级领域特定语言) 4.6(可能是最新的
在我的 on-again-off-again 编译器项目中,我将闭包实现为具有可执行前缀的分配内存。所以一个闭包是这样分配的: c = make_closure(code_ptr, env_size,
我有 2 个关于 boehm-gc 的问题。 GC 回收垃圾对象时,即使对象有析构函数,GC 也会释放内存而不调用析构函数。我发现 GC 调用“finailzer”,但我不知道如何注册它...我该怎么
我有一个使用 Boehm GC 实现的个人项目。我需要实现一种事件类型,它应该包含对其他事件的引用。但我还需要确保指向的事件仍然是可收集的,因此我需要弱引用。 假设我们有事件 A、B 和 C。我将这些
我现在正在学习 boehm gc c++ 接口(interface)。不使用它,只是好奇。我按照官方的例子,写我的类什么可以被 GC,在析构函数中,有一个输出,所以我可以判断一个实例是否被 GC。但只
我在 Android x86 上的 Boehm 中遇到奇怪的崩溃(但 arm 工作正常);它正在崩溃: deferred = *(word *)limit; 与: LogCat: I/DEBUG (
我在以下环境中开发了一个应用程序(在我的错误中重命名为 MyApplication 以保护隐私): 单点触控 2.1 MonoDevelop 2.4.2 MacOS 10.6.8 iOS SDK 4.
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
Boost.Coroutine 分配自己的调用堆栈。 Boehm GC 是否将这些堆栈上的指针视为根,如果不是,我如何才能做到这一点?在上下文切换到协程后,Boehm 终止程序。 最佳答案 推测 Bo
我已经开始在我正在制作的库中使用引用计数。这是一个相当不错的解决方案,递增和递减不会像某些人错误地认为的那样浪费很多资源。此外,用于引用计数的少量额外内存可以忽略不计。 但显然跟踪垃圾收集非常好,它比
据我所知,asprintf 调用 malloc。如果我用 Boehm GC 替换 malloc,对 asprintf 的调用仍然调用传统的 malloc - 至少 valgrind 是这样告诉我的:
这段代码导致了我的内存泄漏,我不确定为什么。 [编辑] 包含来自 here 的代码质疑: #include "src/base.cpp" typedef std::map, gc_allocato
我有一个使用 Boehm GC 的项目,所以我想我可能会使用它自带的 cord 字符串库。问题是我对 cord 函数的所有调用都会导致“ undefined reference ”错误。 我在 /us
我是一名优秀的程序员,十分优秀!