c - 在 C 中处理内存分配的最佳方法?

标签 c memory-management

我认为我已经很好地掌握了如何在 C++ 中处理内存,但在 C 中执行它是不同的,我有点不对。

在 C++ 中,我有构造函数和析构函数,我有非常简单的 new 和 delete,我知道如何使用 RAII、智能指针和在类中使用来封装它。

但是在 C 中我不能以同样的方式处理 malloc 和 free。我不知道如何隐藏它们以及如何使事情自动化。我所能想到的就是使用函数来启动和销毁我的指针。但是我应该如何构建我的内存处理?

在写这篇文章时,我意识到这更多的是关于我对 C 语言流程的理解,而不是其他任何问题,而是一次一个问题。

编辑: 感谢您的回答,但我需要重新措辞。

当我说我在 C++ 中使用 RAII 和智能指针时,我不想在 C 中使用相同的方法,我知道它们不一样。但是我在 C++ 中处理内存分配的方式与这些技术有关。

例如,在我的类(class)中,我动态地添加和销毁我的类(class)使用的内存。这样我就可以实现某种封装,我不需要知道类何时/如何/为什么处理它的内存,它就是这样做的。这意味着我可以“隐藏”较低的内存处理,而只关注一些“​​更大”的类。

我想知道在 C 中处理内存的最佳实践是什么?没有带有构造函数/析构函数的类可以为我处理这个问题。在函数的开头分配内存或使用为我创建它的函数好吗?我应该如何再次释放它们?

这些都是广泛的问题,它们因情况而异,但您更愿意如何处理?您可以提供哪些提示和类(class)?

最佳答案

部分混淆是因为它在 C 中天生更难。mallocfree 类似于 newdelete :malloc 分配新内存,并返回指向该内存的指针。 free 使该内存再次可用,只要它是使用 malloc 分配的内存。否则,它只是对一些内存块进行散列。没关系。

malloc/free 的重要之处在于决定并始终保持有纪律的使用。这里有一些提示:

始终检查从 malloc 返回的指针是否为 NULL

if((p = (char *) malloc(BUFSIZ)) == NULL {
   /* then malloc failed do some error processing. */
}

为了安全带和吊带的安全,在释放它之后将指针设置为 NULL。

free(p);
p = NULL ;

如果可能,尝试在同一范围内分配和释放一 block 内存:

 {  char * p ;
   if((p = malloc(BUFSIZ)) == NULL {
       /* then malloc failed do some error processing. */
   }

 /* do your work. */

   /* now you're done, free the memory */

   free(p);
   p = NULL ;  /* belt-and suspenders */
 }

当你不能时,明确你返回的是 malloc 的内存,这样调用者可以释放它。

 /* foo: do something good, returning ptr to malloc memory */
 char * foo(int bar) {
     return (char *) malloc(bar);
 }

关于c - 在 C 中处理内存分配的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/722922/

相关文章:

linux - 在 Linux 集群中跨机器共享大型映射数据文件

c - Windows Crypto API CryptEncrypt 使用 HashObject

c++ - 从可执行文件中找出编译优化标志

c - 当我打开二进制文件时,fwrite() 和 fread() 如何工作

ios - pushViewController 中的内存泄漏和(我认为)从 GCD 队列返回

ios - Swift 3 TableViewController 不会取消初始化

c - 如何获取库函数的内存位置?

c++ - 在 C++ 程序中使用电子围栏

c - C 中的链表 - 第一个节点数据不正确,无法弄清楚

c - C 中的可变大小矩阵