如何以惯用方式使用C指针包装函数?

时间:2016-12-17 21:20:58

标签: c pointers

来自 21世纪C

  

避免与malloc相关的错误的最简单方法是不使用malloc。

  

生产代码往往很少使用malloc,通常包含在new / copy / free函数中,因此主代码不必进一步处理内存管理。

主要问题:有人可以提供一个超级简单的惯用示例,说明如何使用这样的函数包装来破坏freemalloc的直接用法吗? / p>

次要问题(可选):特别是,聪明地使用这些函数可以模拟C ++ shared_ptr和{{1}的行为(甚至是某些行为) }?也就是说,使用这些功能可以让您免于担心您可能会意外地释放悬空指针和/或造成泄漏?或者在C中这是不可能的,即使使用这些函数?

2 个答案:

答案 0 :(得分:2)

这样的东西? (它将添加一些编译时间检查类型,但是关于它)

typedef struct a_ {
   int a;
   int b;
} a;

a *new_a() {
     return malloc(sizeof(a));
}

void free_a(a *p) {
     free(p);
}

次要问题:Smart pointers/safe memory management for C?

答案 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所说的。这些并没有真正“解决”内存分配问题 - 它仍然可能非常麻烦 - 但它们有所帮助。