Выделение и свободный объект конструкций - PullRequest
0 голосов
/ 16 ноября 2010

gcc 4.4.4 c89

В моем файле channel.h есть следующий код

typedef struct channel_tag channel_t;

channel_t* open_channel(size_t channel_id);
void close_channel(channel_t *channel);

И в моем файле channel.c

#include "channel.h"

struct channel_tag {
    size_t channel_id;
};

channel_t* open_channel(size_t channel_id)
{
    channel_t *channel = malloc(sizeof *channel);

    if(channel == NULL) {
        fprintf(stderr, "Cannot allocate memory\n");
        return NULL;
    }

    channel->channel_id = channel_id;
    printf("Channel [ %zu ] has been created\n", channel->channel_id);

    return channel;
}

void close_channel(channel_t *channel)
{
    printf("Channel [ %zu ] resources has been released\n", channel->channel_id);
    free(channel);
}

Проблема с моим файлом main.c.Здесь у меня есть цикл for, который создает 5 канальных объектов и выделяет для них память.Однако, если я захочу освободить их позже в своей программе, я не уверен, как получить ссылку на них.Это только 5, с которыми я тестирую.Но позже это может быть до 300.

int main(void)
{
    size_t i = 0;

    channel_t *channel = NULL;

    for(i = 0; i < 4; i++) {
        channel = open_channel(i);

        if(channel == NULL) {
            fprintf(stderr, "Cannot create channel [ %zu ]\n", i);
        }
    }

    /* Do some stuff with the channels and now free them before the program exists. 
       However, I need to loop and pass all of them, not just one */
    for(i = 0; i < 4; i++) {
       close_channel(channel);
    }
    return 0;
}

Большое спасибо за любые предложения,

Ответы [ 3 ]

4 голосов
/ 16 ноября 2010

Ну, вы переписываете один и тот же канал снова и снова в основном. Если вам нужно 4 канала, вам, очевидно, нужны 4 переменные для их хранения или массив из 4 элементов.

channel_t *channel[4]; for (...) channel[i] = open_channel(i);

Ох и for (int i = 0; i < 4; i++) сделает 4 петли, а не 5.

1 голос
/ 16 ноября 2010
int main( void )
{
    int i = 0;
    channel_t** channels = malloc( 5 * sizeof( channel_t* ));

    if ( channels == NULL ) exit( 1 ); // error, etc.

    for ( i = 0; i < 5; i++ ) {
        channels[i] = open_channel( i );

        if ( channels[i] == NULL ) {
            fprintf( stderr, "Cannot create channel [ %d ]\n", i );
            break;
        }
    }

    // ... work, but only if i == 5

    for ( i--; i >= 0; i-- ) {
       close_channel( channels[i] );
    }

    free( channels );
    return 0;
}
1 голос
/ 16 ноября 2010

Сохраняйте каналы в массиве по мере их создания. Убедитесь, что вы можете сказать, сработали malloc s или нет в конце программы (отсюда memset в этом коде).

channel_t **channel = malloc(5 * sizeof(channel_t*));
memset(channel, 0, 5 * sizeof(channel_t*));

for(i = 0; i < 5; i++) {
    channel[i] = open_channel(i);

    if(channel[i] == NULL) {
        fprintf(stderr, "Cannot create channel [ %zu ]\n", i);
    }
}

/* Do some stuff with the channels and now free them before the program exists. 
   However, I need to loop and pass all of them, not just one */
for(i = 0; i < 5; i++) {
   if (channel[i] != NULL)  /* Handle case where some of the opens failed */
   {
     close_channel(channel[i]);
   }
}

free(channel);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...