Как быть уверенным, что malloc разместится в другой области? - PullRequest
0 голосов
/ 03 декабря 2010

У меня странная проблема с malloc.У меня есть этот typedefs:

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?б) Как правильно инициировать мьютекс?Я хочу создать новый мьютекс с каждым вызовом!в) я должен malloc для D и T?Я должен освободить их ??

Спасибо за ваше время!A.

Ответы [ 2 ]

6 голосов
/ 03 декабря 2010

Это не похоже на проблему!Вы выделили немного памяти, а затем вернули ее обратно в систему.Затем вы запросили больше памяти того же размера, и система malloc заметила, что есть доступная память такого размера - та же память, которую она дала вам раньше!

Если вы удалите вызовbuffer_destroy() вы должны увидеть, что вы получаете разные значения.(Кстати, я рекомендую использовать «% p» для печати значений указателя, а не «% d»).

0 голосов
/ 03 декабря 2010

Я думаю, что у malloc есть внутренняя таблица, и когда вы освобождаете память (со свободным), ячейка просто устанавливается на «busy = 0», тогда память доступна для других данных. Так что здесь не проблема, имо.

...