c语言中的内存处理

c语言中的内存处理,c,malloc,C,Malloc,我在用C编写的大型应用程序中工作。我们通过malloc分配内存,并为不同的指针释放内存。我看到我们一直在重复检查 对于内存故障情况,请释放内存。 我计划写一个实用程序,程序员将通过他们想要的指针 创建,我们将负责所有内存的分配和释放 有没有人知道有什么实用函数可以在C中用于分配和释放内存 我想到的第一个答案是boost library,但我收到了我的组织的答复,他们不想使用boost library。怎么样?如果您只是想寻找一种统一的方法(无代码重复)来检查分配是否成功,请参阅本文的最后一部分

我在用C编写的大型应用程序中工作。我们通过
malloc
分配内存,并为不同的指针释放内存。我看到我们一直在重复检查 对于内存故障情况,请释放内存。 我计划写一个实用程序,程序员将通过他们想要的指针 创建,我们将负责所有内存的分配和释放

有没有人知道有什么实用函数可以在C中用于分配和释放内存


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

怎么样?

如果您只是想寻找一种统一的方法(无代码重复)来检查分配是否成功,请参阅本文的最后一部分


首先,
boost
主要是一个用于
C++
的库,因此所有的
boost
不能在C中使用

编写自己的垃圾收集器并不容易,尤其是在没有真正的OOP的语言中(例如
C
)。在线上有很多垃圾收集器的实现,因此您可以查看其中的一些,而不是重新发明轮子

如果你不打算使用它们中的任何一个,那么。。至少他们会为你提供一些关于如何解决问题的信息


根据项目大小,您最好使用查找泄漏数据,然后自己管理内存分配/释放

C已经存在很多年了,许多开发人员在没有自动垃圾收集器的情况下进行管理。为什么你不能这样做


分配时的简单错误检查(错误时中止)
#包括
#包括
空虚*
安全分配检查(无效*p,大小){
if(p==NULL){
printf(“错误:无法为%lu字节分配内存!”,大小);
出口(-1);
}
返回p;
}
#定义s_malloc(N)安全分配检查(malloc(N),N)
#定义s_calloc(C,N)安全分配检查(calloc(C,N),N)
#定义s_realloc(P,N)安全分配检查(realloc(P,N),N)
...
int*p=s_malloc(sizeof(int));

如果您只是想寻找一种统一的方法(无代码重复)来检查分配是否成功,请参阅本文的最后一部分


首先,
boost
主要是一个用于
C++
的库,因此所有的
boost
不能在C中使用

编写自己的垃圾收集器并不容易,尤其是在没有真正的OOP的语言中(例如
C
)。在线上有很多垃圾收集器的实现,因此您可以查看其中的一些,而不是重新发明轮子

如果你不打算使用它们中的任何一个,那么。。至少他们会为你提供一些关于如何解决问题的信息


根据项目大小,您最好使用查找泄漏数据,然后自己管理内存分配/释放

C已经存在很多年了,许多开发人员在没有自动垃圾收集器的情况下进行管理。为什么你不能这样做


分配时的简单错误检查(错误时中止)
#包括
#包括
空虚*
安全分配检查(无效*p,大小){
if(p==NULL){
printf(“错误:无法为%lu字节分配内存!”,大小);
出口(-1);
}
返回p;
}
#定义s_malloc(N)安全分配检查(malloc(N),N)
#定义s_calloc(C,N)安全分配检查(calloc(C,N),N)
#定义s_realloc(P,N)安全分配检查(realloc(P,N),N)
...
int*p=s_malloc(sizeof(int));

在函数(通常称为
xmalloc
)中包装
malloc
,该函数在
malloc
无法返回新内存块(通过返回
NULL
)时中止

如果您在Unix系统上,使用
valgrind
捕获内存泄漏是很有帮助的


如果您想要一个C的垃圾收集器,请考虑在一个函数(通常称为“代码> xMalOLC/<代码>”中使用< /p>b>包>代码> MaloC < /C>,当 MaloC/<代码>无法返回新的内存块(通过返回代码> null < /C> >时)中止。 如果您在Unix系统上,使用

valgrind
捕获内存泄漏是很有帮助的


如果你想要一个C的垃圾收集器,考虑使用< /P> < P>我不确定你在追求什么。在C语言中,处理内存分配和释放的一种常用技术是实现一个内存跟踪数据结构,该结构包含许多指向已使用自己的

malloc、calloc、realloc
实现分配的内存的指针,例如
mymalloc、mycalloc、myrealloc
(调用原始函数本身),然后使用新函数
free\u 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\u memtrace,end\u memtrace
函数,以便分配函数“知道”记录指针的位置。这些信息可以存储在本地模块中,您可以在该模块中实现
mymalloc、mycalloc、myfree、free\u memtrace…

我不确定您想要的是什么。C中处理内存分配和释放的一种常用技术是实现一个内存跟踪数据结构,其中包含一个数字of指向使用自己的
malloc、calloc、realloc
实现分配的内存的指针,例如
mymalloc、mycalloc、myrealloc
(调用原始函数本身),然后使用新函数
free\u memtrace
在一次函数调用中释放记录在跟踪中的所有内存

所以,例如,你可以做什么

MEMTRACE mt;  // Possibly a module-scoped global variable

begin_memtrace( &mt );
    ptr1 = mymalloc( size );
    ptr2 = mycalloc( n, sizeof(type) );
end_memtrace( &mt );
然后在某个时候