используя malloc для жизни программы - PullRequest
2 голосов
/ 15 сентября 2010

gcc 4.4.4 c89

Я всегда думал о том, чтобы использовать malloc для жизненного цикла проекта, чтобы быть его областью действия.

Но мне просто интересно, является ли моя идея лучшей практикой,Например, я инициализирую экземпляр структуры в main.И создать 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 ]

4 голосов
/ 15 сентября 2010

Хорошо выглядит.

У меня есть точка или 2 о create_network_device

Network_dev* create_network_device(Network_dev *network)

нет необходимости передавать указатель; Я бы предпочел Network_dev* create_network_device(void)

{
    network = malloc(sizeof *network);

if не является действительно необходимым; если malloc не удалось, то return network в конце функции совпадает с return NULL.

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

Если распределение прошло успешно, вы можете убедиться, что члены структуры находятся здесь в состоянии знания

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

    return network;
}
3 голосов
/ 15 сентября 2010

Этот код выглядит хорошо для меня. Я согласен с pmg, что ваш 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 голосов
/ 15 сентября 2010
  • Лучше всего выделить память и свободную память в одной и той же функции.Так же, как вы открываете и закрываете файлы в одной и той же функции.Вы сделали это, создав и уничтожив Network_dev в функции main (), что хорошо.Это позволяет легко подтвердить, что все неправильные расположения также освобождены.
  • Лучше всего malloc () что-то как можно позже и освободить () как можно скорее.То есть держите память как можно короче.Если работа вашей программы - что-то делать с Network_dev, вы все сделали правильно.Если ваша программа делает много других вещей, вы должны делать это до malloc () или после free ().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...