关于链表操作的删除节点的一个问题

donglq 2009-11-12 12:45:50
直接贴代码了 看看有什么问题
typedef struct buffer_item bItem;
struct buffer_item{
char *buf;
unsigned length;
bItem *next;
};

bItem *malloc_buf(int size)
{
bItem *buf = (bItem *)malloc(sizeof(bItem));
buf->buf = (char *)malloc(size + 1);
return buf;
}


void free_buf(bItem *node)
{
// free(node->buf); //主要看这里 到底要不要这句
free(node);
node->buf = NULL;
node = NULL;
}
...全文
169 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
donglq 2009-11-18
  • 打赏
  • 举报
回复
问题已经查出,感谢各位
donglq 2009-11-13
  • 打赏
  • 举报
回复
终于知道错误了 其实不是我的程序的问题
只要设置环境变量就可以了 如下
export MALLOC_CHECK_=0

高手解释下这是什么问题
The_facE 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 donglq 的回复:]
这个问题很奇怪 我单独测试上面的代码就没问题,放到一个较大的项目里面这里就出问题,
[/Quote]

很明显你的链表在别处做了其他内存处理。
donglq 2009-11-13
  • 打赏
  • 举报
回复
这个问题很奇怪 我单独测试上面的代码就没问题,放到一个较大的项目里面这里就出问题,
squiffy 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 donglq 的回复:]
引用 15 楼 squiffy 的回复:
引用 14 楼 donglq 的回复:
终于知道错误了 其实不是我的程序的问题
只要设置环境变量就可以了 如下
export MALLOC_CHECK_=0

高手解释下这是什么问题

你这仅仅是不检查内存了,很危险。说明你写越界过。这样不查是没问题了,哪天莫名其妙崩溃了就累死人的。


言之有理
但是我确实是用
free(node->buf)就报错
不好查阿 那位朋友可提供检查的方法
[/Quote]

首先,这句话肯定是要的。按照你的描述,一定是内存越界了。

因为,内存检查的原理一般是这样的:
1、在申请内存的时候,多几个字节,填写成一个特殊值。
2、在free之类的时候,检查多申请的那几个特殊值有没有被改写,如果改写则抛异常。

在VC下,我会调试。VC可以设置条件断点,你看一眼malloc的时候,申请的那个地址是多少,然后往后加你申请的长度。然后设置一个条件断点,看看哪个地方往这个位置写东西了,只要写VC的断点就停。

看你的描述,你在linux下,GDB我不是很熟悉,不知道哪里设置条件断点:这个一定可以设置的。
donglq 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 squiffy 的回复:]
引用 14 楼 donglq 的回复:
终于知道错误了 其实不是我的程序的问题
只要设置环境变量就可以了 如下
export MALLOC_CHECK_=0

高手解释下这是什么问题

你这仅仅是不检查内存了,很危险。说明你写越界过。这样不查是没问题了,哪天莫名其妙崩溃了就累死人的。
[/Quote]

言之有理
但是我确实是用
free(node->buf)就报错
不好查阿 那位朋友可提供检查的方法
squiffy 2009-11-13
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 donglq 的回复:]
终于知道错误了 其实不是我的程序的问题
只要设置环境变量就可以了 如下
export MALLOC_CHECK_=0

高手解释下这是什么问题
[/Quote]
你这仅仅是不检查内存了,很危险。说明你写越界过。这样不查是没问题了,哪天莫名其妙崩溃了就累死人的。
donglq 2009-11-12
  • 打赏
  • 举报
回复
我也觉得应该加 但是测试表明加上会报错 double free
squiffy 2009-11-12
  • 打赏
  • 举报
回复
最好加上:
if(node->buf) free(node->buf)
hzhxxx 2009-11-12
  • 打赏
  • 举报
回复

最好用类方式思考,用构造函数和析构函数去负责管理类内部的内存
hzhxxx 2009-11-12
  • 打赏
  • 举报
回复
The_facE 2009-11-12
  • 打赏
  • 举报
回复
我看不用再说什么了吧?如果仅仅是一个结构体,这样没什么问题。如果你要把程序扩大到一个链表,需要重新考虑一下这两个函数,哪里需要再修改一下。


#include <stdlib.h>
#include <string.h>


typedef struct buffer_item bItem;
struct buffer_item
{
char *buf;
unsigned length;
bItem *next;
};

bItem *malloc_buf(int size)
{
bItem *buf = (bItem *)malloc(sizeof(bItem));
buf->buf = (char *)malloc(size + 1);
buf->length = size;
buf->next = NULL;
return buf;
}


void free_buf(bItem **pNode)
{
// free(node->buf); //主要看这里 到底要不要这句
if ( (*pNode) == NULL )
{
return;
}
if ( (*pNode)->buf )
{
free( (*pNode)->buf );
(*pNode)->buf = NULL;
}
if ( (*pNode) )
{
free( (*pNode) );
(*pNode) = NULL;
}
}

int main()
{
bItem * pItem = malloc_buf( 14 );
strcpy( pItem->buf, "112233" );
free_buf( &pItem );
return 0;
}
donglq 2009-11-12
  • 打赏
  • 举报
回复

if (node->buf)
free(node->buf);
node->buf = NULL;
if(node)
free(node);
node = NULL;


这样也有错 错误相同
tienchiu 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shenzhiwanghz 的回复:]
free(node); //这里已经释放了node
node->buf = NULL; //这里怎么可以再访问node的成员????出错会不会是这里导致的??
node = NULL;

[/Quote]

先确认这个再说
shenzhiwanghz 2009-11-12
  • 打赏
  • 举报
回复
free(node); //这里已经释放了node
node->buf = NULL; //这里怎么可以再访问node的成员????出错会不会是这里导致的??
node = NULL;
shenzhiwanghz 2009-11-12
  • 打赏
  • 举报
回复
if(node->buf){
free(node->buf);
node->buf = NULL;
}

释放前要先判断是否为空。
你说的出错,我觉得有两种可能。
1.buf是空的,释放0x00000000的空间,导致内存访问出错。
2.buf已经被释放过一次,但是没有被赋为NULL,导致访问已经被收回的内存,出错。

所以释放前的判断,和释放以后的置NULL都是很重要的。
donglq 2009-11-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 cattycat 的回复:]
free(node->buf);
node->buf=NULL;
free(node);
[/Quote]

继续顶起 你的这个做法其实就是说要 free(node->buf)了 但是我说了 测试下来是会报错的

顶起 顶起
cattycat 2009-11-12
  • 打赏
  • 举报
回复
free(node->buf);
node->buf=NULL;
free(node);

69,382

社区成员

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

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