在程序的生命周期中使用malloc

时间:2010-09-15 14:22:33

标签: c malloc

gcc 4.4.4 c89

我一直想到将malloc用作项目的生命周期。

但我只是想知道我的想法是否是最好的做法。例如,我在main中初始化struct的实例。并创建2个用于创建和销毁的功能。我只是想知道这是否是正确的做法。

下面我有一些骨架代码。

非常感谢任何建议,

typedef struct Network_dev_t {
    size_t id;
    char *name;
} Network_dev;

Network_dev* create_network_device(Network_dev *network)
{
    network = malloc(sizeof *network);
    if(network == NULL) {
        return NULL;
    }    
    return network;
}

void do_something(Network_dev *network)
{
    /* Do something with the network device */
}

void destroy_network_device(Network_dev *network)
{
    free(network);
}

int main(void)
{
    Network_dev *network = NULL;

    network = create_network_device(network);

    /* Do something with the network device */
    do_something(network);

    destroy_network_device(network);

    return 0;
}

3 个答案:

答案 0 :(得分:4)

看起来不错。

我对create_network_device

有一点或两点
Network_dev* create_network_device(Network_dev *network)

无需传入指针;我宁愿拥有Network_dev* create_network_device(void)

{
    network = malloc(sizeof *network);

if并非真的有必要;如果malloc失败,则函数末尾的return networkreturn NULL相同。

    if(network == NULL) {
        return NULL;
    }

如果分配成功,您可能希望确保结构成员在此处处于已知状态

    /* if (network) {       */
    /*     id = 0;          */
    /*     name = NULL;     */
    /* }                    */

    return network;
}

答案 1 :(得分:3)

这段代码对我来说很好看。我同意你的create_network_device可以使用一点点工作。只是把他说的话拉到一起并使事情更清楚,这就是我写这个函数的方式:

Network_dev *create_network_device()
{
    Network_dev *network = malloc(sizeof(*network));
    if (network) {
        network->id = 0;
        network->name = NULL;
    }
    return network;
}

答案 2 :(得分:2)

  • 最好在同一个功能中分配内存和空闲内存。就像你在同一个函数中打开和关闭文件一样。你通过在main()函数中创建和销毁Network_dev来做到这一点,这很好。这样可以很容易地确认所有malloced位置也被释放。
  • 最好尽可能晚地使用malloc(),尽快使用free()。也就是说,尽可能缩短内存。如果你的程序的工作是使用Network_dev做一些事情,你做得很好。如果你的程序做了很多其他事情,你应该在malloc()之前或者free()之后执行它们。