我在一个用c写的大型应用程序中工作。我们通过malloc
分配内存,并为不同的指针释放内存。我看到我们一直在重复检查对于内存失效的情况,不如释放内存。我计划写一个实用程序,其中程序员将传递他们想要的指针创建,我们将负责所有内存的分配和释放。
有没有人知道C语言中有什么实用函数可以用来分配和释放内存?
我想到的第一个答案是boost library,但是我已经从我的组织收到了他们不想使用boost library的答案。
Boehm Garbage Collector怎么样?
如果你只是在寻找一种统一的方式(没有代码重复)来检查分配是否成功,请参阅这篇文章的最后一部分。
首先boost
主要是C++
的库,因此boost
不能全部在c中使用。
编写自己的垃圾收集器并不容易,特别是在没有真正面向对象的语言中(如C
)。网上有很多垃圾收集器的实现,所以与其重新发明轮子,你可以看看其中的一些。
如果你不打算使用它们中的任何一个,那么…至少他们会给你提供一些关于如何解决问题的信息。
- C和c++的垃圾收集器(Boehm-Demers-Weiser) [recommended] 使用C/c++垃圾收集库,libgc
根据项目的大小,你可能会更好地使用valgrind
寻找泄漏的数据,然后自己管理内存分配/释放。
C已经存在很多年了,很多开发人员都没有使用自动垃圾收集器。你为什么不能做同样的事呢?
分配时的简单错误检查(错误时中止)
#include <stdio.h>
#include <stdlib.h>
void*
safe_alloc_check (void *p, size_t size) {
if (p == NULL) {
printf ("ERROR: Unable to allocate memory for %lu bytes!", size);
exit (-1);
}
return p;
}
#define s_malloc(N) safe_alloc_check(malloc(N),N)
#define s_calloc(C,N) safe_alloc_check(calloc(C,N),N)
#define s_realloc(P,N) safe_alloc_check(realloc(P,N),N)
...
int *p = s_malloc (sizeof (int));
将malloc
封装在一个函数中(通常称为xmalloc
),当malloc
无法返回一个新的内存块(通过返回NULL
)时,该函数将终止。
如果您在Unix系统上,使用valgrind
捕获内存泄漏是有帮助的。
如果你想要一个C语言的垃圾收集器,考虑使用Boehm的垃圾收集器
我不知道你在找什么。在C语言中,处理内存分配和释放的一种常用技术是实现一个内存跟踪数据结构,它保存了一些指向内存的指针,这些内存是使用你自己的malloc, calloc, realloc
实现分配的,例如mymalloc, mycalloc, myrealloc
(调用原始函数本身),然后使用一个新的函数free_memtrace
来释放在一个函数调用中记录在跟踪中的所有内存。
例如,你可以写
MEMTRACE mt; // Possibly a module-scoped global variable
begin_memtrace( &mt );
ptr1 = mymalloc( size );
ptr2 = mycalloc( n, sizeof(type) );
end_memtrace( &mt );
然后在程序的某个地方
free_memtrace( &mt );
清除mt
中记录的内存。
需要begin_memtrace, end_memtrace
函数,以便您的分配函数"知道"在哪里记录指针。该信息可以本地存储在实现mymalloc, mycalloc, myfree, free_memtrace ...
的模块中。