c语言中的内存处理



我在一个用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 ...的模块中。

相关内容

  • 没有找到相关文章