在C中分配和释放内存最安全的方法是什么?

时间:2010-07-19 11:47:34

标签: c memory-management

使用C,是否有比使用malloc更安全的内存分配方式?例如,是否有一个C等效的智能指针,或某人提出的一些方便的功能,使分配过程更清洁?我的意思是,当然,它只是一条线,但必须有一个更简洁的方法来完成它。我想这个问题的解除分配部分包含在C中是否有类似于智能指针的内容中。

6 个答案:

答案 0 :(得分:4)

使用malloc和realloc,然后使用Valgrind进行大量测试。稍后使用像Boehm这样的GC bite you in the ass。如果你正在使用C,请使用C.一个值得研究的lib是halloc。

答案 1 :(得分:4)

分配过程似乎很清楚:每个malloc-ed块都应该是免费的。我想到的最简单的下一步(在GC之前)就是编写一个“跟踪”你的分配的函数,这样你在代码/函数的出口就可以在单个函数调用中释放你所需要的一切(当然,另一个功能允许像往常一样释放单个块。这会增加一点内存使用量,但一旦正确实现,就可以更容易地在一次拍摄中逐个释放分配的块。

用法如下:

MemPool *pool = mempool_create();

// use
char *t = mempool_alloc(pool, size);
// ...
char *b = mempool_alloc(pool, size2);
// ...
int *c = mempool_alloc(pool, xy * sizeof(int));
// free a single piece for whatever reason...
mempool_free(pool, b);
// ...

// when you finished with this "pool":
mempool_destroy(pool);

这至少应该确保在“池”中分配的所有内容都与mempool_destroy一起免费编辑,因此在最糟糕的用法中,您可以使用“池”机制分配所有内容,并在以后释放所有内容你不再需要它了(例如在一个函数的出口处)。 (可能“池”不是一个合适的名称)

答案 2 :(得分:3)

分配内存最安全的方法是简单地了解它是如何正常工作的。如果您想要安全的语言,请使用安全的语言。 Java已经实现了垃圾收集的自动化。

如果你想使用C,你最好的选择就是拥抱它。你可能在某些时候被烧掉,但是,有了痛苦,就会有经验。

我一直认为对学生有用的一件事是将每个分配视为有一些额外信息,即责任。你通过内存本身来承担内存块的责任,无论谁是最后一个负责任的人,都必须释放它。

此外,没有两段代码可以同时具有可重用性。换句话说,当您将记忆传递给另一方时,在被给予回复之前,您不得触摸它。

答案 3 :(得分:2)

您可以编写自己的垃圾收集器。如果你找不到或没有那种时间,那么答案是否定的。这是人们使用C ++的主要原因之一,与malloc / free相比,自动资源管理赢得了超乎想象的胜利。如果你能负担得起GC的性能,那就转向更快(开发)的语言。唯一的另一种解决方案是转向C ++,它既不需要垃圾收集器也不需要手动内存管理。

答案 4 :(得分:1)

为什么不直接使用堆栈?

答案 5 :(得分:1)

如果您真的觉得C的标准内存管理太不安全,您应该通过切换到为您进行内存管理的不同编程语言或使用也为您进行内存管理的垃圾收集器来避免它,例如Boehm的:

http://www.hpl.hp.com/personal/Hans_Boehm/gc/

智能指针在C ++中有所帮助,但仍需要提高认识,即在构建循环结构时。