我有一个C#类,有一个静态的ImageList对象.此图像列表将与我的应用程序中的多个表单上的各种ListView标头(通过SendMessage ... HDM_SETIMAGELIST)共享.
虽然我知道静态对象不符合垃圾收集的条件,但我不清楚它们是否也不符合垃圾收集器的重定位(压缩).我是否还需要固定此对象,因为它与非托管代码共享,例如,使用GCHandle.Alloc?
环境是VS 2008,Compact Framework 3.5.
我是否还需要固定该对象,因为它与非托管代码共享,例如使用 GCHandle.Alloc?
是的。如果指针没有被固定,GC则可以自由移动该内存,因此您可能有悬空C++指针,指向一些无效的内存,或者更糟糕的是,根本不指向它们的内存。
另外,“共享”这个词也应该澄清。如果您分配并传递给非托管内存,并将其复制到某个地方,您可以避免不断地固定它们。取决于将控制权传递给非托管环境后会发生什么。
编辑
即使考虑@Brian 的有趣答案,我仍然会选择固定指针。为了在代码中明确固定指针的概念,避免在将来的代码维护中出现任何可能的误导并保持清晰度。
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |