为什么FREE函数运行出错?

来源:百度知道 编辑:UC知道 时间:2024/05/16 10:09:22
变量定义:

typedef struct s_inverseindex
{
float fWeight;
long dSaveDataSeek;
long dSaveDataIndexSeek;
long dSavePageSeek;
char caSaveDataPath[CD_FILE_PATH];
char caSavePagePath[CD_FILE_PATH];
char caUrlKey[32+1];
char caOther[3+1];
struct s_inverseindex *next;
} S_INVERSEINDEX;

typedef struct s_inverseindex_lb
{
char indexkey[32+1];
char indexmsg[CD_HTML_WORD];
char indexpath[CD_FILE_PATH];
char indexpathstat[1+1];
struct s_inverseindex_lb *next;
struct s_inverseindex *inverse_index;
} S_INVERSEINDEX_LB;

程序代码:

int FreeInverseIndexNode( struct s_inverseindex_lb *pInverseIndexT )
{
S_INVERSEINDEX_LB *pNode, *pNext;
S_INVERSEINDEX *pIINode, *pIINext;

pNode = pNext = NULL ;
pIINode = pIINext = NULL ;

if(!pInverseIndexT) return 0;

for( pNext = pInverseIndexT; pNext

1、楼主的代码中函数FreeInverseIndexNode()能够正常释放内存。甚至可以删除如下的初始化局部变量的指令,如:
pNode = pNext = NULL ;
pIINode = pIINext = NULL ;
也不会影响程序的正常运行。
2、问题可能出在调用该函数的方式上。比如:调用函数时传递了一个链表头指针pInverseIndexT,该指针所指向动态内存在函数内部得到了释放,但是该指针本身没有清空。当然,该指针应当在函数外部清空,以免重复释放同一个链表。比如:
... // 初始化链表p
FreeInverseIndexNode(p); // 释放p指向的链表
p = NULL; // 清空链表指针p

我把楼主的程序片断想办法运行了一下,测试之后并没有发现楼主所说的问题。
因为代码不全,我们也只能猜测了。
我的猜测是,CD_HTML_WORD这个宏是否定义得太小了,来源是楼主的例子"中文信息"和"zhongwenxinxi",前者只占9或10个字节,而后者占14个字节。
如果仅有少量节点,这并不会造成太明显的问题,但是如果结点比较多,而溢出的字节有可能覆盖掉一些重要的信息,从而造成崩溃。
当然只是猜测,如果可能,希望楼主能给出具体代码。

1. 初步看了下,楼主的函数本身不存在问题
2. 如xniren所说的,释放内存后的指针指向NULL,避免重复释放同一个链表。
3. 不知道楼主的程序是单线程的还是多线程的,如果是单线程的话,这个free应该不会产生问题,但如果是多线程的话,可能free了一个其他线程正在使用的内存空间,导致程序出错。

你的程序中申请的两个都是结构指针,没有对指针分配相应的内存空间。
指针是需要分配空间的。
你可以使用malloc分配,分配后再用free释放空间。
至于你说的中文问题,无法解释,你的内存已经溢出了,后面的错误无法判断。