Tag: 垃圾收集

可以保护未存储初始地址的堆对象免受垃圾回收吗?

假设 我正在修改别人的C程序; 垃圾收集器处于活动状态; 堆上有一个对象,我不希望垃圾收集器收获; 和 对象一直存在,直到程序退出,所以没有必要释放()它。 我必须存储对象的初始地址吗? 假设我不关心初始地址。 假设我只关心对象内部的一些指针,并且这些指针都是我存储的。 假设我扔掉了初始地址。 垃圾收集器会收获我的对象吗? 附加信息 据我所知,该程序现在不收集垃圾。 但是,如果程序的未来版本开始收集垃圾,那么我今天添加的代码可能会突然变成一个难以发现的错误。 我不想做一个难以发现的错误; 但该计划是一个古老而稳定的计划,已有数千名用户使用多年。 因此,已知程序在各种实际条件下可接受地起作用。 重新设计不是一种选择。 该程序采用全球数据结构,它从不困扰free()。 这是我必须在其中工作的设计。 如果你想知道:我希望存储的指针 – 指向其对象内部的指针 – 碰巧指向ASCII字符串中的单词。 我只关心单词,而不是整个字符串。 特别是,我不关心字符串开头的空格,这就是为什么我不关心字符串的初始地址; 但垃圾收集者可能会无意中关心,可能不是吗? 存储一个链接的指针列表似乎很愚蠢,我和其他任何人都不会使用它,只是为了抵挡一个不存在的假设垃圾收集器; 但如果真的有必要,我会存储清单。 或者我的担忧是没有根据的? 无论如何,没有人会向旧的C程序添加垃圾收集吗?

Lua:垃圾收集+ userdata

假设以下情况: typedef struct rgb_t {float r,g,b} rbg_t; // a function for allocating the rgb struct rgb_t* rgb(r,g,b) { rgb_t* c = malloc(sizeof(rgb_t)); c->r=r; c->g=g; c->b=b; return c; } // expose rgb creation to lua int L_rgb (lua_State* L) { rgb_t** ud = (rgb_t **) lua_newuserdata(L, sizeof(rgb_t *)); *ud = rgb(lua_tonumber(L,1),lua_tonumber(L,2),lua_tonumber(L,3)); return 1; } 当从Lua调用L_rgb函数时,会发生两次分配。 Lua分配新的userdata并为结构分配rgb构造函数。 […]

使用C API的弱表和GC终结器

我试图通过使用C API将其存储在弱表中来为函数值创建GC终结器。 我开始在纯Lua 5.2中编写原型: local function myfinalizer() print ‘Called finalizer’ end function myfunc() print ‘Called myfunc’ end local sentinels = setmetatable({}, { __mode=’k’ }) sentinels[myfunc] = setmetatable({}, { __gc=myfinalizer }) myfunc() myfunc = nil collectgarbage ‘collect’ print ‘Closing Lua’ 结果输出: Called myfunc Called finalizer Closing Lua 原型似乎按预期工作。 以下是C版: #include #include #include “lua.h” #include “lualib.h” #include […]

gdb:为SIGBUS处理程序设置断点

我正在尝试使用GDB调试一个简单的停止和复制垃圾收集器(用C语言编写)。 GC通过处理SIGBUS来工作。 我在SIGBUS信号处理程序的顶部设置了一个断点。 我告诉GDB将SIGBUS传递给我的程序。 但是,它似乎不起作用。 以下程序(内联解释)显示了我的问题的本质: #include #include #include #include #define HEAP_SIZE 4096 unsigned long int *heap; void gc(int n) { signal(SIGBUS, SIG_DFL); // just for debugging printf(“GC TIME\n”); } int main () { // Allocate twice the required heap size (two semi-spaces) heap = mmap(NULL, HEAP_SIZE * 2, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, […]

当我们用c中的字符串文字初始化一个char数组时,是否会发生垃圾收集?

当我们在C中编写以下代码行时, char local_arr[] = “I am here”; 文字“我在这里”被存储在内存的只读部分(比如RM )。 我如何想象它是如何在RM中连续存储的(是吗?)。 然后,数组local_arr (即本地数组)通过索引从RM中的位置复制此数组索引。 但是在local_array复制之后,文字会发生什么? 它是否丢失从而导致内存泄漏? 或者是否有类似Java的垃圾收集器来清理未引用的对象? 例如,如果我写一段代码如下: for(int i=0;i<100000;i++) char local[] = "I am wasting memory"; 我不会用完记忆吗? 每次迭代都会在每次迭代时创建相同文字的新实例吗? 或者他们都会引用相同的文字,因为每次文字的价值是相同的? RM是属于堆内存还是堆中的专用段? 本地数组也存储在堆栈中,对吧? 如果我使用动态数组或全局数组怎么办? 那么会发生什么?

如何为C中实现的解释语言提供垃圾收集?

如果我要在C中实现垃圾收集的解释语言,如何在不编写自己的垃圾收集器的情况下提供精确(即不保守)的垃圾收集? 有可用的库吗? 如果是这样,哪些? 我知道我必须在垃圾收集器跟踪的任何对象上维护某些不变量。

如何安排自定义标记扫描收集器的收集周期?

我为Postscript虚拟机编写了一个简单的垃圾收集器,我很难设计一套适当的规则来何时进行收集(当空闲列表太短时?)以及何时分配新空间(当有很多空间可供使用?)。 到目前为止,我自下而上写过,但这个问题涉及顶级设计。 所以我觉得我处于不稳定的状态。 所有对象都是通过操作员函数进行管理和访问的,因此这是C中的收集器,而不是C中的收集器。 主分配器函数称为gballoc : unsigned gballoc(mfile *mem, unsigned sz) { unsigned z = adrent(mem, FREE); unsigned e; memcpy(&e, mem->base+z, sizeof(e)); while (e) { if (szent(mem,e) >= sz) { memcpy(mem->base+z, mem->base+adrent(mem,e), sizeof(unsigned)); return e; } z = adrent(mem,e); memcpy(&e, mem->base+z, sizeof(e)); } return mtalloc(mem, 0, sz); } 我确定在不知道所有类型和函数意味着什么的情况下是乱码,所以这里是相同函数的伪代码: gballoc load free list head into […]

有没有特定的原因垃圾收集不是为C设计的?

我听说C自动收集垃圾是不是最理想的 – 这有什么道理吗? 是否有特定原因没有为C实施垃圾收集?

堆栈内存上的free()

我在Solaris上支持一些c代码,至少我认为它是奇怪的: char new_login[64]; … strcpy(new_login, (char *)login); … free(new_login); 我的理解是,由于变量是本地数组,因此内存来自堆栈而不需要释放,而且由于没有使用malloc / calloc / realloc,因此行为未定义。 这是一个实时系统,所以我认为这是一个浪费周期。 我错过了一些明显的东西吗

查找数据段的地址范围

作为编程练习,我在C中编写了一个标记 – 清除垃圾收集器。我希望扫描数据段(全局等)以获得指定内存的指针,但我不知道如何获取该段的地址。 我怎么能这样做?