使用Stream已经彻底解决了这个问题。如前四期所述。
至于附加问题:
★1
使用 CreatStreamOnHGlobal 而不是 SHCreatMemStream。
因为SHCreatMemStream在调用过程中会对传入的内存块参数进行另一次内存复制。
CreatStreamOnHGlobal 创建流后不执行内存复制。您可以先通过GlobalAlloc分配内存,写入所需的图像数据,然后调用CreatStreamOnHGlobal,无需任何时间开销。另外,可以将CreatStreamOnHGlobal的第二个参数设置为true,自动释放GlobalAlloc分配的内存。
通过进程内存监控,我发现对于同一个程序,使用CreatStreamOnHGlobal的速度是SHCreatMemStream的两倍,并且不会导致内存泄漏。
★2
创建的Stream需要调用Release方法减少一个引用。
IRandomAccessStream作为局部变量,会自动析构,无需主动释放。
并且BitmapImage还管理一部分引用,这些引用在离开作用域后被释放。
通过测试COM对象上Release方法的返回值,发现整个程序结束后引用计数又回到了0