绑定对象(密封)破坏非破坏缓冲区

时间:2010-12-25 10:35:11

标签: c# garbage-collection bitmap unmanaged

我先解释一下我的情况:我对使用Bitmap constructor that takes scan0, stride and format感兴趣,因为我正在解码平铺图像,我想选择自己的步幅,这样我就可以解码这些图块而不用关心解码器部分的界限。

无论如何,问题在于文档说:     The caller is responsible for allocating and freeing the block of memory specified by the scan0 parameter. However, the memory should not be released until the related Bitmap is released.

我无法轻松释放缓冲区,因为Bitmap会传递给另一个最终会破坏它的类,而我无法控制它。是否有某种方法(hacky,我知道)告诉GC在Bitmap被销毁时也释放我的缓冲区?

(此外,欢迎任何替代解决方案。)

3 个答案:

答案 0 :(得分:2)

查看ConditionalWeakTable<TKey, TValue> Class。它是一个特殊的字典类,其中键被弱引用,只要键处于活动状态,值就会保持活动状态。

您可以实例化ConditionalWeakTable&lt; Bitmap,UnmanagedMemoryHandle&gt;其中UnmanagedMemoryHandle是一个自定义类,包含指向非托管内存的指针,并在处理或完成时释放该内存。该表将弱引用Bitmap;只要Bitmap存在,UnmanagedMemoryHandle就会保持活动状态,因此当Bitmap被垃圾收集时,非托管内存将被释放。

答案 1 :(得分:1)

如果一个类创建了一个非托管资源,那么不要让其他任何人破坏它,因为它会很混乱。仅在创建它的类中使用非托管资源。例如,您可以克隆位图并发布该位图。

答案 2 :(得分:0)

不,你在这里迷路了。问题是,如果跟踪内存,你回到C ++时代,基本上你“松散”了内存的责任。没有办法意识到备忘录何时被释放。