如何区别 托管资源 与 非托管资源 ??

问题描述

C#.NET里如何区别托管与非托管资源,以防止忘记释放某个非托管资源而导致内存爆满?我很困惑,尤其是数据库链接OleDbConnection或是SqlConnection这些Conn对象,是直接用.Dispose()就可以放心了呢还是必须.Close()和.Dispose()一起用才放心不会导致内存爆炸?

解决方案

解决方案二:
实现IDisposable的类可以使用Dispose()方法释放其中的非托管资源也就是说如果你的类中用到如文件流网络链接等具有受保护的Finalize方法的类型时为其实现IDisposable接口并在Dispose()方法内释放资源或者使用如下语法using(托管资源类xxxx=....){操作}语义上程序运行在这里xxxx已经被释放详细请参考http://msdn2.microsoft.com/zh-cn/library/498928w2(VS.80).aspx
解决方案三:
两个都用 放心
解决方案四:
我很奇怪啊,为什么Conn.Dispose()之后Conn==null的结果仍然是False啊?难道是这个对象仍然存在?只是把内存空间释放了?那释放了空间之后,这个对象又放哪里去了啊?

时间: 2024-09-14 12:33:41

如何区别 托管资源 与 非托管资源 ??的相关文章

asp.net C#调用托管DLL和非托管DLL文件的区别

asp教程.net c#调用托管dll和非托管dll文件的区别 托管dll文件,可以在dotnet环境通过 "添加引用" 的方式,直接把托管dll文件添加到项目中.然后通过 using  dll命名空间,来调用相应的dll对象 .     非托管dll文件,在dotnet环境应用时,通过 dllimport 调用.    c# 调用非托管dll文件.dll文件是用c语言编写的. 如下: 1:结构定义   rditag_t     rditag_t结构定义了测点的结构   typedef

C# 托管内存与非托管内存之间的转换(结合Unity3d的实际开发)

1.c#的托管代码和非托管代码 c#有自己的内存回收机制,所以在c#中我们可以只new,不用关心怎样delete,c#使用gc来清理内存,这部分内存就是managed memory,大部分时候我们工作于c#环境中,都是在使用托管内存,然而c#毕竟运行在c++之上,有的时候,(比如可能我们需要引入一些第三方的c++或native代码的库,在Unity3d开发中很常见)我们需要直接在c#中操纵非托管的代码,这些non-managed memory我们就需要自己去处理他们的申请和释放了, c# 中提供

c++.net 托管类封装非托管类

C++.net中非托管的代码虽然在托管里面可以直接使用,但是有时候却会被限制.比如当需要用托管里面的 ArrayList 存储一个非托管的对象的时候就需要用一个托管的类把这个非托管的类封装一下,其他的封装的原因我也没想到,刚开始接触c++.net,基本是需要什么学什么,我是这个原因才去封装的.   比如一个非托管的类如下 class serverInfo { public: serverInfo(); ~serverInfo(); string CSTR_DBIPADDRESS; //数据库ip

非托管dll-C#调用非托管DLL,报“其他内存已损坏”,请问怎么解决呢?

问题描述 C#调用非托管DLL,报"其他内存已损坏",请问怎么解决呢? 定义: [DllImport("BSEncrypt.dll")] public static extern bool MD5String(ref string instr, int inlen, ref string outstr, int outlen); 调用: String ls_MD5Password = new String('', 100); string as_Password =

.Net托管资源非托管资源垃圾回收的疑问

CLR为开发者提供了一个非常让人激动的功能--垃圾回收.但是园子里关于垃圾回收的讨论,大多是讨论垃圾回收的原理,以及Dispose模式.但是垃圾回收在实际使用时,是不是可以达到其设计的目标,在开发过程中有没有需要注意的问题呢?本人也不是非常明确,这篇文章希望能达到抛砖引玉的效果,希望个人牛人能够给本人或同样存在疑惑的人一个清楚明确的答案. 什么是垃圾回收?就是说你在使用CLR的时候(不包含托管资源) ,只需要new一个对象使用.而不需要通过程序代码进行释放对象(以上是本人理解的垃圾回收的意义).

.net非托管资源的回收方法_实用技巧

本文实例讲述了.net非托管资源的回收方法,分享给大家供大家参考.具体分析如下: 释放未托管的资源有两种方法   1.析构函数 2.实现System.IDisposable接口   一.析构函数  构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数.析构函数初看起来似乎是放置释放未托管资源.执行一般清理操作的代码的最佳地方.但是,事情并不是如此简单.由于垃圾回收器的运行规则决定了,不能在析构函数中放置需要在某一时刻运行的代码,如果对象占用了宝贵而重要的

.NET简谈互操作(四:基础知识之Dispose非托管内存)

互操作系列文章: .NET简谈互操作(一:开篇介绍) .NET简谈互操作(二:先睹为快) .NET简谈互操作(三:基础知识之DllImport特性) .NET简谈互操作(四:基础知识之Dispose非托管内存) .NET简谈互操作(五:基础知识之Dynamic平台调用)  .NET简谈互操作(六:基础知识之提升平台调用性能) .NET简谈互操作(七:数据封送之介绍) 我们继续.NET互操作学习.前一篇文章中我们学习了基础知识中的DllImport关键特性:我们继续学习基础知识中的内存释放相关技术

对象-java中io等非托管资源close与赋值为null有什么区别

问题描述 java中io等非托管资源close与赋值为null有什么区别 io操作如果没有close而直接赋值为null有什么后果,而close之后又没有赋值为null,也就是还有对象的引用,那这个对象会不会释放内存,垃圾回收器会不会回收它 Reader reader = new InputstreamReader(new FileInputStream()); 如果reader.close()关闭了reader的资源 则FileInputStream的资源有没有关闭 ,没关闭的话如何关闭 解决

.NET,你忘记了么?(二)——使用using清理非托管资源

我们都知道,垃圾回收可以分为Dispose和Finalize两类,关于这两者的区别已经太多了 ,一个是正常的垃圾回收GC所调用的方法,另外一个是终结器Finalizer,所调用的方法,在 Effective C#一书中,有着明确的建议是说使用IDispose接口来代替Finalize.原因是因为 Finalize终结会增加垃圾回收对象的代数,从而影响垃圾回收. 有了上述的原因,我们现在只来看使用IDispose接口的类. 在.NET中,绝大多数的类都是运行在托管的环境下,所以都由GC来负责回收,