2010-11-16 58 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; 
}