c中的内存处理

时间:2011-12-18 12:04:36

标签: c malloc

我正在使用C编写的大型应用程序。我们通过malloc分配内存并为不同的指针释放内存。我看到所有时间都有重复检查 对于内存故障情况比释放内存。 我打算编写一个实用程序,程序员将在其中传递他们想要的指针 创建,我们将注意所有内存的分配和释放。

有没有人知道任何可以在C中用于分配和释放内存的效用函数。

我的第一个答案是提升库,但我收到了组织的答复,他们不想使用boost库。

4 个答案:

答案 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 ...的模块中。