社区
C语言
帖子详情
malloc和free
sunweirong
2009-08-20 09:27:16
我用pthread建立两个线程,其中一个malloc一块内存,另一个则free。现在在调试是的执行顺序是这样的,先malloc,然后free,再malloc,两次分配的地址一样,但接下来free时报告段错误。这是什么原因,应该现在free的地址已经是重新分配的,不会有问题的阿?
...全文
485
25
打赏
收藏
malloc和free
我用pthread建立两个线程,其中一个malloc一块内存,另一个则free。现在在调试是的执行顺序是这样的,先malloc,然后free,再malloc,两次分配的地址一样,但接下来free时报告段错误。这是什么原因,应该现在free的地址已经是重新分配的,不会有问题的阿?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
CSAPP:
malloc
lab 文档及解答
学生用来实现自己的
malloc
, realloc和
free
函数。 Students implement their own versions of
malloc
,
free
, and realloc. This lab gives students a clear understanding of data layout and organization, and ...
C++
malloc
和
free
但是
malloc
和
free
是函数,而new 和 delete 是运算符。除此之外,new 在申请内存的同时,还会调用对象的构造函数,而
malloc
只会申请内存;同样,delete 在释放内存之前,会调用对象的析构函数,而
free
只会...
C语言之
malloc
和
free
总结
1、内存分配和函数介绍 ...C语言提供的两个标准库函数:
malloc
和
free
。 1)
malloc
函数 原型:void *
malloc
(size_t size); 简介:该函数在内存的动态存储区中分配一块长度为size字节的连续区域;如
简单分析
malloc
和
free
源码实现
在编码过程中,我们往往只关心如何使用系统提供的API,比较容易忽略内在的原理。C/C++编码中,能够安全地...而今天就来说说glibc内存
malloc
和
free
的源码探究以及说明下为什么
free
指针时,不需要指定内存块大小。 ...
C语言中频繁的
malloc
和
free
导致的
free
()错误
背景:网络数据处理的程序,2Gbps的流量,每个数据包都有数次
malloc
和
free
操作 经过:使用tcpreplay回放数据包进行测试,同一批数据反复回放,在15分钟左右会出现
free
()的错误,错误出现时间不固定,最长坚持了45...
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章