如何确保malloc将在不同的区域分配

Alf*_*oli 0 c malloc free pointers

我对malloc有一个奇怪的问题.我有这个typedef:

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;
Run Code Online (Sandbox Code Playgroud)

这是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);
}
Run Code Online (Sandbox Code Playgroud)

如果我打印(在每次调用正确的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!!!
Run Code Online (Sandbox Code Playgroud)

我很确定问题是buffer_t的初始化和释放出了问题,你知道吗,按顺序:

a)如何正确地将缓冲区释放到buffer_destroy中?b)如何正确启动互斥锁?我希望每次调用都创建一个新的互斥锁!c)我必须用于D和T的malloc?我必须解除他们?

谢谢你的时间!一个.

psm*_*ars 6

这看起来不像是个问题!你已经分配了一些内存,然后将其释放回系统.然后你要求更多相同大小的内存,而malloc系统已经注意到有一些大小的内存 - 它之前给你的内存!

如果您取消对您的通话,buffer_destroy()您应该会看到不同的值.(顺便说一句,我建议使用"%p"来打印指针值,而不是"%d").

  • 尽管在Linux上不太可能出现问题,但PTHREAD_MUTEX_INITIALIZER仅用于静态初始化器*.(即具有静态对象生命周期的互斥锁).您不应该将它用于局部变量,然后复制该互斥锁,使用=运算符复制互斥锁是posix未定义的.使用pthread_mutex_init() (3认同)
  • @Alfredo:看起来你有很多潜在的误解.它不是"相同的互斥锁",而是同一地址的新互斥锁.如果在调用"free"之后仍有任何内容仍然指向并尝试使用旧的互斥锁,则代码将被破坏.也许你应该更多地解释发生了什么. (2认同)
  • @Alfredo Di Napoli:恐怕我不得不同意@R. - 在Linux上我肯定,因为我很熟悉代码,用PTHREAD_MUTEX_INITIALIZER在同一地址重新初始化互斥锁将*完全*重新初始化互斥锁,不留下任何先前在同一地址的任何痕迹,*提供*当时没有其他线程在互斥上等待.正如R.所说,如果另一个线程在你释放它时使用互斥锁,那么*那个*是你需要修复的问题,而不是新的互斥锁在同一个地方被重新分配的事实:-) (2认同)