日期:2014-05-17  浏览次数:21305 次

c#中的非托管资源,是在内存中的哪里开辟的?
神们,C#内存分为线程的堆栈和托管堆。而这非托管资源又开辟于哪里?不可能是栈或托管堆上啊。
还有一个windows菜鸟问题:对某位图进行操作,需要先获取位图句柄。请问这个获取句柄的操作,是在内存中开辟一块空间来存储这个位图?然后返回地址?如果没有获取句柄的操作,则程序的资源位图只存在于电脑硬盘中,没有存储在内存中? 我把这个句柄获得到后,别的程序也可以通过这个句柄来操作位图么?

------解决方案--------------------
堆栈。
可以看下clr var c#
看下里面讲解值类型和引用类型的段落。
------解决方案--------------------
这种问题很容易想明白。
那些在内存耗尽前首先会被耗尽的资源就不能等到释放内存的时候再释放。

比如说,如果你的数据库只允许10个并发连接。但是开了100个连接对象只占用很少的内存并不足以让GC开始回收。那么你当然要手工释放。

再比如,你读写完文件,自然希望尽快取消文件的锁定,那么你也不应该等析构函数调用dispose的时候再调用。
------解决方案--------------------
调用dispose是用来释放非托管资源的,如果不存在非托管资源,那步完全可以省略,即使执行了也没有任何动作。而你不清楚是否有非托管资源的话,最好是调用下,做到及时释放内部资源,而对象本身何时释放就不知道了,看GC的高兴,但必须是没有任何引用的情况下。