我认为我已经很好地掌握了如何在 C++ 中处理内存,但在 C 中执行它是不同的,我有点不对。
在 C++ 中,我有构造函数和析构函数,我有非常简单的 new 和 delete,我知道如何使用 RAII、智能指针和在类中使用来封装它。
但是在 C 中我不能以同样的方式处理 malloc 和 free。我不知道如何隐藏它们以及如何使事情自动化。我所能想到的就是使用函数来启动和销毁我的指针。但是我应该如何构建我的内存处理?
在写这篇文章时,我意识到这更多的是关于我对 C 语言流程的理解,而不是其他任何问题,而是一次一个问题。
编辑: 感谢您的回答,但我需要重新措辞。
当我说我在 C++ 中使用 RAII 和智能指针时,我不想在 C 中使用相同的方法,我知道它们不一样。但是我在 C++ 中处理内存分配的方式与这些技术有关。
例如,在我的类(class)中,我动态地添加和销毁我的类(class)使用的内存。这样我就可以实现某种封装,我不需要知道类何时/如何/为什么处理它的内存,它就是这样做的。这意味着我可以“隐藏”较低的内存处理,而只关注一些“更大”的类。
我想知道在 C 中处理内存的最佳实践是什么?没有带有构造函数/析构函数的类可以为我处理这个问题。在函数的开头分配内存或使用为我创建它的函数好吗?我应该如何再次释放它们?
这些都是广泛的问题,它们因情况而异,但您更愿意如何处理?您可以提供哪些提示和类(class)?
最佳答案
部分混淆是因为它在 C 中天生更难。malloc
和 free
类似于 new
和 delete
: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/