2010-11-16 59 views
0

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; 
} 

的任何建議非常感謝,

回答

1

存儲頻道在一個數組,你創建它們。請確保您可以分辨程序結束時malloc是否工作(因此在此代碼中爲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); 
+1

第一行應該是'channel_t ** ...',對嗎? – 2010-11-16 17:02:58

+0

是的,謝謝@尼古拉。太多的C++。 – 2010-11-16 17:03:47

+1

'memset()'在這種情況下不需要:'channel [i]'在被測試之前被分配到任何地方。如果你想檢查'malloc()'的結果,你應該在'channel'上調用'memset()'之前這樣做。 – Sjoerd 2010-11-17 09:07:20

4

那麼,你是一遍又一遍地重寫同一個信道爲主。如果你想要4個通道,你顯然需要4個變量來存儲它們,或者一個有4個項目的數組。

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

哦,for (int i = 0; i < 4; i++)將4路並不5.

+0

您的權利只有4迴路,該代碼只是爲了測試我的理論。謝謝。 – ant2009 2010-11-16 17:00:34

1
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; 
}