malloc和free

sunweirong 2009-08-20 09:27:16
我用pthread建立两个线程,其中一个malloc一块内存,另一个则free。现在在调试是的执行顺序是这样的,先malloc,然后free,再malloc,两次分配的地址一样,但接下来free时报告段错误。这是什么原因,应该现在free的地址已经是重新分配的,不会有问题的阿?
...全文
485 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunweirong 2009-08-21
  • 打赏
  • 举报
回复
我这只是程序的一小部分,但是用malloc和free的就这两个地方,会和其他部分冲突吗。头大了
bamtu 2009-08-21
  • 打赏
  • 举报
回复
不知道lz怎么弄得,我这样跑没问题哎。。。
整个代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
#include <errno.h>

typedef struct _cmd_fifo{
char command[100];
struct _cmd_fifo* next;
}cmd_fifo;

pthread_mutex_t cmd_queue = PTHREAD_MUTEX_INITIALIZER;
sem_t cmd_queue_count;
cmd_fifo *head, *tail;

void *thread_1(void *arg);
void *thread_2(void *arg);

int main(int argc,char** argv)
{
pthread_t t_1, t_2;
sem_init(&cmd_queue_count,0,0);

head = NULL;
tail = NULL;

pthread_create(&t_1,NULL,thread_1,NULL);
sleep(1);
pthread_create(&t_2,NULL,thread_2,NULL);

while(1)
pause();
return 0;
}

void *thread_1(void *arg)
{
char cmd[100];

while(1)
{
pthread_mutex_lock(&cmd_queue);
cmd_fifo *command=(cmd_fifo *)malloc(sizeof(cmd_fifo));
if(command == NULL)
{
printf("malloc failed. %s",strerror(errno));
exit(1);
}
memcpy(command->command,cmd,100);
command->next=NULL;
if(head==NULL)
head=tail=command;
else
{
tail->next=command;
tail=command;
}
sem_post(&cmd_queue_count);
pthread_mutex_unlock(&cmd_queue);

sleep(1);
}
}

void *thread_2(void *arg)
{
while(1)
{
sem_wait(&cmd_queue_count);
pthread_mutex_lock(&cmd_queue);
char cmd[100]="";
memcpy(cmd,head->command,100);
cmd_fifo *temp=head;
if(head==tail)
head=tail=NULL;
else
head=head->next;
free(temp);
printf("free OK!\n");
pthread_mutex_unlock(&cmd_queue);
}
}
Tomzzu 2009-08-21
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 kakashi0309 的回复:]
  free后立即置为NULL
[/Quote]
下次判断时不为NULL时再free
kakashi0309 2009-08-21
  • 打赏
  • 举报
回复
free后立即置为NULL
sytstarac 2009-08-21
  • 打赏
  • 举报
回复
好像是啊。第一次malloc以后,head和fail还是==的,如果此时free,是free不了的。LS已经改好了吧。
yueyucanyang 2009-08-21
  • 打赏
  • 举报
回复
你调试的顺序不一定是实际执行的顺序吧。这样做还是危险比较大。
jack_wq 2009-08-21
  • 打赏
  • 举报
回复
free(temp);
改为:
if(NULL != temp)
{
free(temp);
temp = NULL;
}就不会重复释放了,这是个习惯的问题
eijikayn 2009-08-20
  • 打赏
  • 举报
回复
第一次应该是有释放,但是第二次释放是因为head没有赋值,所以你释放的地址是不正确的,你可以把地址都打印一下看看
sunweirong 2009-08-20
  • 打赏
  • 举报
回复
是的 释放掉,重新分配的地址和第一次分配的一样,然后再free就出错
superbtl 2009-08-20
  • 打赏
  • 举报
回复
你单步进去 保证指针释放掉了 地址重新分配还是一样吗?
sunweirong 2009-08-20
  • 打赏
  • 举报
回复
还是错的,到底怎么解决呢
superbtl 2009-08-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sunweirong 的回复:]
楼上能解释一下修改的原因吗,谢谢
[/Quote]你第一次可能就没有释放掉 因为你if(head==tail) 条件符合要释放指针的
superbtl 2009-08-20
  • 打赏
  • 举报
回复
LS好眼力啊 手也好快
sunweirong 2009-08-20
  • 打赏
  • 举报
回复
楼上能解释一下修改的原因吗,谢谢
jinwei1984 2009-08-20
  • 打赏
  • 举报
回复
void read()

sem_wait(&cmd_queue_count);
pthread_mutex_lock(&cmd_queue);
char cmd[100]="";
memcpy(cmd,head->command,100);
cmd_fifo *temp=head;
if(head==tail)

free(temp);//
head=tail=NULL;

else
{
head=head->next;
free(temp);
}
...
pthread_mutex_unlock(&cmd_queue);
sunweirong 2009-08-20
  • 打赏
  • 举报
回复
我这个是想实现fifo队列,head,tail初始都是null,队列为空,第一次插入时,head和tail都指向第一个元素,其后插入的tail向后移动。删除是当head和tail指向同一个元素时表示队列只有一个元素,把他门都设为null,否则head向后移,把第一个元素free掉。
所以第二次时head指向的地址应该是对的
jinwei1984 2009-08-20
  • 打赏
  • 举报
回复
肯定没同步好吧?
free的时候,如果已经free一次了,再第二次free的时候是会出现未定义行为的
建议在free后面加一句将指针设置为 NULL
eijikayn 2009-08-20
  • 打赏
  • 举报
回复
首先先要看下你的head定义,在线程1中你只有head==null才会对head赋值,然后第一次释放后你的head!=null,所以第二次时候不会对head重新赋值,这个时候head指向地址已经不对了,所以你第二次free时候失败
sunweirong 2009-08-20
  • 打赏
  • 举报
回复
两次分配的地址一样 为什么是溢出,怎么处理
sunweirong 2009-08-20
  • 打赏
  • 举报
回复
线程一
void recv()
{
.....
pthread_mutex_lock(&cmd_queue);
cmd_fifo *command=(cmd_fifo *)malloc(sizeof(cmd_fifo));
memcpy(command->command,cmd,100);
command->next=NULL;
if(head==NULL)
head=tail=command;
else
{
tail->next=command;
tail=command;
}
sem_post(&cmd_queue_count);
pthread_mutex_unlock(&cmd_queue);
}

线程二
void read()

sem_wait(&cmd_queue_count);
pthread_mutex_lock(&cmd_queue);
char cmd[100]="";
memcpy(cmd,head->command,100);
cmd_fifo *temp=head;
if(head==tail)
head=tail=NULL;
else
head=head->next;
free(temp);
...
pthread_mutex_unlock(&cmd_queue);

这是两个线程
加载更多回复(5)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧