【发布时间】:2010-12-03 16:22:53
【问题描述】:
我对 malloc 有一个奇怪的问题。我有这个类型定义:
typedef struct buffer {
int D;
int T;
unsigned int current_size;
unsigned int max_size;
pthread_mutex_t mutex;
pthread_cond_t non_pieno;
pthread_cond_t non_vuoto;
msg_t** messages;
struct buffer* (*buffer_init)(unsigned int);
void (*buffer_destroy)(struct buffer*);
} buffer_t;
这是 buffer_init 和 buffer_destroy 函数:
buffer_t* buffer_init(unsigned int maxsize)
{
buffer_t* new_buffer = (buffer_t*)malloc(sizeof(buffer_t));
msg_t** new_messages = (msg_t**)calloc(maxsize, sizeof(msg_t**));
pthread_mutex_t mx = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t np = PTHREAD_COND_INITIALIZER;
pthread_cond_t nv = PTHREAD_COND_INITIALIZER;
new_buffer->T = 0;
new_buffer->D = 0;
new_buffer->current_size = 0;
new_buffer->max_size = maxsize;
new_buffer->messages = new_messages;
new_buffer->mutex = mx;
new_buffer->non_pieno = np;
new_buffer->non_vuoto = nv;
new_buffer->buffer_init = buffer_init;
new_buffer->buffer_destroy = buffer_destroy;
return new_buffer;
}
void buffer_destroy(buffer_t* buffer) {
pthread_mutex_destroy(&buffer->mutex);
free(buffer);
}
如果我打印(在每次调用正确的 buffer_destroy buffer_init 序列之后)我获得的指针是最相同的!! 例如
buffer_t* my_buff;
my_buff = buffer_init(1);
printf("%d", my_buff); //e.g 10023
printf("%d", my_buff->mutex); //e.g 56778
buffer_destroy(my_buff);
my_buff = buffer_init(1);
printf("%d", my_buff); //10023 again!!!
printf("%d", my_buff->mutex); //56778 again!!!
我很确定问题是buffer_t的初始化和释放出了问题,你知道吗,按顺序:
a) 如何正确地将缓冲区释放到 buffer_destroy? b)如何正确初始化互斥锁?我想在每次调用时创建一个新的互斥锁! c)我必须为 D 和 T 分配 malloc 吗?我必须释放它们??
感谢您的宝贵时间! A.
【问题讨论】:
-
您为什么认为这是问题所在?如果内存被释放,它可以被重用。尝试分配两个缓冲区而不释放它们,在这种情况下地址必须不同。