2009-12-15 23:02:20| 分类: 疑难杂症 HEAP: Free Heap block ×××modified at ×××after it was freed 问题很严重!第一次出现异常提示时,程序依然继续运行;若干次之后,程序异常中断,函数调用栈不能提供足够的有效信息。 看起来似乎是内存重复释放的问题,其实不然!因为程序是在若干次循环后才出现这一问题,如果是重复释放,应该是第一次循环就会出现这个问题。 刚才我在路上仔细想了一下,觉得是由于内存溢出导致的,而不是重复释放内存。其实,这类似于ShellCode的原理,即越界访问。由于程序是在Debug模式下运行,Debug模式下,内存不是紧凑排列的,所以,虽然有越界访问,但不会立刻导致程序崩溃。 如果这一推断正确,那么,release模式下,程序应该崩溃!但是结果令我大失所望。
2009.12.16 之前认为这是filter队列阻塞所致。而我改用线程处理,问题依旧,于是,我认为这是内存溢出,而不是队列满了的缘故。 我使用了几种侦测内存溢出的方法检测代码,发现并没有内存溢出,一切正常。于是,我再次想到队列阻塞。
问题重现: 为了证实这一判断,我在Transform中加入如下代码: Filter Graph大约每秒传递10个数据块,如果我强制性地Sleep,造成人为性的队列阻塞,应该是可以再现上面的问题的! 而事实正是如此!十几秒之后,同样的问题出现了! 由此可以断定,这个问题是队列阻塞所致。由于队列是由DirectShow来管理的,所以,这里要分析和处理的话,还是比较困难的,需要重载相关的类。只能是提升压缩效率了。 (###) |
|