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

使用C,是否有比使用malloc更安全的内存分配方式?例如,是否有一个C等效的智能指针,或某人提出的一些方便的功能,使分配过程更清洁?我的意思是,当然,它只是一条线,但必须有一个更简洁的方法来完成它。我想这个问题的解除分配部分包含在C中是否有类似于智能指针的内容中。     
已邀请:
分配过程似乎很清楚:每个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
自由编辑的,所以在最糟糕的用法中你可以用“池”机制分配所有内容,并在你不再需要它时释放所有内容(例如在功能的出口处)。 (可能“池”不是合适的名称)     
通过使用malloc和realloc,然后使用Valgrind进行广泛测试。使用像Boehm这样的GC会在以后咬你的屁股。如果你正在使用C,请使用C.一个值得研究的lib是halloc。     
分配内存最安全的方法是简单地了解它是如何正常工作的。如果您想要安全的语言,请使用安全的语言。 Java具有自动化垃圾收集功能。 如果你想使用C,你最好的选择就是拥抱它。你可能会在某些时候被烧焦,但是,有了痛苦,就会有经验。 我一直认为对学生有用的一件事是将每个分配视为有一个额外信息,即责任。你传递一个内存块的责任与内存本身,谁是最后一个负责任的人是必须释放它的人。 此外,没有两段代码可以同时具有可重用性。换句话说,当您将记忆传递给另一方时,您不能触摸它直到它被给予回复。     
你可以编写自己的垃圾收集器。如果你找不到或没有那种时间,那么答案是否定的。这是人们使用C ++的主要原因之一,与malloc / free相比,自动资源管理赢得了超乎想象的胜利。如果你能负担得起GC的性能,那就转向更快(开发)的语言。唯一的另一种解决方案是转向C ++,它既不需要垃圾收集器也不需要手动内存管理。     
为什么不直接使用堆栈?     
如果您真的觉得C的标准内存管理太不安全,您应该通过切换到为您执行内存管理的不同编程语言或使用也为您执行内存管理的垃圾收集器来避免它,例如Boehm: http://www.hpl.hp.com/personal/Hans_Boehm/gc/ 智能指针在C ++中有所帮助,但仍需要意识,即在构建循环结构时。     

要回复问题请先登录注册