来自 21世纪C :
避免与malloc相关的错误的最简单方法是不使用malloc。
和
生产代码往往很少使用malloc,通常包含在new / copy / free函数中,因此主代码不必进一步处理内存管理。
主要问题:有人可以提供一个超级简单的惯用示例,说明如何使用这样的函数包装来破坏free
和malloc
的直接用法吗? / p>
次要问题(可选):特别是,聪明地使用这些函数可以模拟C ++ shared_ptr
和{{1}的行为(甚至是某些行为) }?也就是说,使用这些功能可以让您免于担心您可能会意外地释放悬空指针和/或造成泄漏?或者在C中这是不可能的,即使使用这些函数?
答案 0 :(得分:2)
这样的东西? (它将添加一些编译时间检查类型,但是关于它)
typedef struct a_ {
int a;
int b;
} a;
a *new_a() {
return malloc(sizeof(a));
}
void free_a(a *p) {
free(p);
}
答案 1 :(得分:1)
这是两个流行的习语:
1。围绕malloc
的包装器,以便它“永不失败”:
void safe_malloc(size_t size)
{
char *ret = malloc(size);
if(ret == NULL) {
fprintf(stderr, "out of memory\n");
exit(1);
}
return ret;
}
这样,您可以随时随地拨打safe_malloc
,也不用担心检查其返回值。但是你只能在一个程序中使用这个成语,你不介意如果malloc失败会导致程序自动退出(即如果在这种情况下没有数据丢失需要担心)。
2。特定结构类型的“新”函数:
struct whatever *new_whatever()
{
struct whatever *ret = safe_malloc(sizeof(*ret));
initialize_whatever(ret);
return ret;
}
我不确定这些是你在找什么,我不确定他们是Ben Klemens所说的。这些并没有真正“解决”内存分配问题 - 它仍然可能非常麻烦 - 但它们有所帮助。