Tag: 空闲

在C中的每次错误检查后如何避免长链的免费(或删除)?

假设我非常防御地编写代码,并且总是检查我调用的所有函数的返回类型。 所以我喜欢: char* function() { char* mem = get_memory(100); // first allocation if (!mem) return NULL; struct binder* b = get_binder(‘regular binder’); // second allocation if (!b) { free(mem); return NULL; } struct file* f = mk_file(); // third allocation if (!f) { free(mem); free_binder(b); return NULL; } // … } 注意free()事物失控的速度有多快。 如果某些function失败,我必须先释放每一个分配。 代码很快变得丑陋,我所做的就是将所有内容复制粘贴。 我成为了一个复制/粘贴程序员,更糟糕的是,如果有人在其间添加一个声明,他必须修改下面的所有代码来调用free()来添加它。 […]

malloc()/ free()在哪里存储分配的大小和地址?

malloc()和free()在哪里存储分配的地址及其大小(Linux GCC)? 我已经读过一些实现将它们存储在实际分配的内存之前的某个地方,但是在我的测试中我无法确认。 背景,也许有人有另一个提示:我正在尝试分析进程的堆内存,以确定另一个进程中字符串的当前值。 访问进程堆内存并浏览它是没有问题的。 但是,因为字符串的值发生了变化,并且进程每次都会分配内存的新部分,所以字符串的地址会发生变化。 因为字符串有一个固定的格式,它仍然很容易找到,但经过一些更改后,旧版本的字符串仍然在堆内存中(可能已释放,但仍未被重用/覆盖),因此我无法分辨哪个字符串是当前字符串。 因此,为了仍然找到当前的一个,我想检查我在内存中找到的字符串是否仍然使用,通过比较其地址与malloc / free知道的地址。 ciao,Elmar