对于释放一块内存的一知半解,希望高手不吝赐教!! 谢谢!!

Silenthunter 2006-07-22 07:27:48
我在解压缩算法中碰到这句话
*(t = &(q->v.t)) = (struct huft *)NULL;
执行的时候出现了为处理的异常,访问冲突。我对一些知识一知半解,似乎听说过编译器回收一块内存的时候判断该处内存的结尾之类的,不知道这个说法的详细内容是什么,怎么理解。

另外一个最现实而且迫切的问题就是这个算法代码在很多开源项目里面都使用了,肯定不会有什么问题,那么请问是不是不编译器的问题呢?应该如何去改呢?? 谢谢!

附:结构定义
huft_t ** t;
register huft_t *q;
typedef struct huft
{
unsigned char e; /* number of extra bits or operation */
unsigned char b; /* number of bits in this code or subcode */
union {
unsigned char n; /* literal, length base, or distance base */
struct huft *t;/* pointer to next level of table */
} v;
}huft_t;
...全文
261 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
goodluckyxl 2006-07-22
  • 打赏
  • 举报
回复
我在解压缩算法中碰到这句话
*(t = &(q->v.t)) = (struct huft *)NULL;
执行的时候出现了为处理的异常,访问冲突。我对一些知识一知半解,似乎听说过编译器回收一块内存的时候判断该处内存的结尾之类的,不知道这个说法的详细内容是什么,怎么理解。
//内存回收是有手动回收和系统回收,申请释放就是你说的回收
//判断内存结尾是有这么一回事,在free的实现过程中你需要对malloc,free 包装有一定了解
//分配按照一定的规则分配,系统会记录相应的分配信息,你说的内存结尾填充数据检测只是其中的一个方面,free的时候会对这块分配的内存进行是否越界扫描就是扫描填充数据是否完整。
ok明白了么?
jixingzhong 2006-07-22
  • 打赏
  • 举报
回复
关于内存的回收,
在 C 中,
不需要考虑其他的内容,
只需要一个语句: free(q)

只是这个指针 q 必须是需要释放的内存空间的首地址,
至于这块空间的大小,
系统会自动判别的 ...

但是在 C++ 中,
使用 delete 时候需要分别处理:
delete p; //一个元素,即单个变量,如 int *p =new int;
delete[] p; //多个元素,数组,或者其他,如 int *p = new int[9];
goodluckyxl 2006-07-22
  • 打赏
  • 举报
回复
to:Silenthunter
你的短消息刚刚才看到
关于你的两个问题
第一个问题.出错的情况如果是你认为的内存错的话,可能最大的是q这个指针未分配有效的地址
那么对于q指针的操作将引起内存错。
第二个问题:这个代码并不是linux下特有的,是标准c支持的写法,遵循从左到右运算顺序,
分解开书写也是一样的,把括号内的东西当一个操作,后面赋值一个操作。
这样写作用只是减少了一句代码,对于比较熟悉c语言的在阅读上也不会带来很大困难
分开写就是这样
t = &(q->v.t);
*t=NULL; 或者 q->v.t = NULL; 效果都一样
还有什么不懂吗?


jixingzhong 2006-07-22
  • 打赏
  • 举报
回复
指针在使用之前是需要分配空间的,
这里 t = &(q->v.t)
那么需要分配的内存是 q:
q = (huft_t *)malloc(sizefo(huft_t));
(t不需要分配内存,因为t被赋值为 q->v.t 的地址)

*(t = &(q->v.t)) = (struct huft *)NULL;
这个语句看起来更应该是一个指针的初始化语句,
定义两个指针,
并把指针初始化为 NULL
(初始化: *t = NULL, q->v.t=NULL)

这里指针关系有点绕,楼主仔细看看 ...
jixingzhong 2006-07-22
  • 打赏
  • 举报
回复
这里没有回收内存之类的事情啊 ...

赋值语句是没有释放内存的作用的,
如果说赋值语句是在 free 之后的话,
也只能说是一些预防非法操作而已,
赋值语句本身和释放内存并没有任何关系 ...
tailzhou 2006-07-22
  • 打赏
  • 举报
回复
你的代码全不全??
t = &(q->v.t),
这里的q分配地址了没??

jixingzhong 2006-07-22
  • 打赏
  • 举报
回复
我想问题是楼主对指针操作有问题,
*(t = &(q->v.t))
这个 t被赋值为 是 q 指针指向的结构体中的 联合体成员中的指针 的地址,
q 分配内存后,
还需要给 这个联合体中的 指针分配,
然后才可以操作 t ...

有点绕,
楼主检查一下这个问题看看
lovefreex 2006-07-22
  • 打赏
  • 举报
回复
学习..
  • 打赏
  • 举报
回复
flush()
??????????

69,373

社区成员

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

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