以前没有接触过com编程,这段时间的项目用到了dshow,在调试的时候发现程序长时间运行的时候,句柄和线程数一直在不断的上涨。猜测是com对象没有释放导致的。
调试的时候可以跟到release函数,看汇编可以猜出来哪个地方是判断reference计数的。如果不正确,就仔细检查它的使用。我犯得错误是在createInstance里面new了一个新对象,然后又addref了,实际上createInstance的调用者会addref,在里面就没有必要了。还有使用filter graph的时候,最好在最后把filter都delete,然后再graph->release();以后不会用到的interface,一定要即使的release,别等到最后清理的时候来弄。
调用CoFreeUnusedLibraries可以把没用的库从进程中卸掉,但是有个时差:10分钟,这是为了保证多线程的安全,但是在单线程中表现也是一样的。CoUninitialize也有10分钟的时延。