我正在使用C编写的大型应用程序。我们通过malloc
分配内存并为不同的指针释放内存。我看到所有时间都有重复检查
对于内存故障情况比释放内存。
我打算编写一个实用程序,程序员将在其中传递他们想要的指针
创建,我们将注意所有内存的分配和释放。
有没有人知道任何可以在C中用于分配和释放内存的效用函数。
我的第一个答案是提升库,但我收到了组织的答复,他们不想使用boost库。
答案 0 :(得分:2)
答案 1 :(得分:2)
如果您只是寻找统一的方式(没有代码重复)来检查分配是否成功,请参阅此帖子的最后一部分。
首先boost
主要是C++
的库,因此所有boost
都不能在C中使用。
编写自己的垃圾收集器并不容易,尤其是在没有真正OOP的语言中(例如C
)。垃圾收集器有许多在线实现,所以不用重新发明轮子就可以看看它们中的一些。
如果您不打算使用其中任何一个,那么......至少它们会为您提供有关如何解决问题的一些信息。
根据项目规模的不同,您最好使用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));
答案 2 :(得分:0)
在函数(通常称为malloc
)中包裹xmalloc
,当malloc
无法返回新的内存块时(通过返回NULL
)中止该函数。
如果您使用的是Unix系统,使用valgrind
来捕获内存泄漏是有帮助的。
如果您想要C的垃圾收集器,请考虑使用Boehm's garbage collector
答案 3 :(得分:0)
我不确定你在追求什么。在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 ...
的模块中。