在.net中,反复使用动态生成的含有非托管资源的对象,是否会产生内存泄露? ( 积分: 20 )

  • 主题发起人 mycwcgr_new
  • 开始时间
M

mycwcgr_new

Unregistered / Unconfirmed
GUEST, unregistred user!
在下面的程序中,将new myclass()动态的赋值给a1,然后执行a1.dosomething(),如果在dosomething()中使用了非托管资源,由于myclass没有释放资源,会不会产生内存泄露?非托管资源应放在myclass的什么地方释放, 如何处理这一类的问题?
退一步说,就算dosomething()没有使用非托管资源,由于.net不能显示的释放对象,循环语句会大量的占用系统资源,运行会非常慢?

using System;
namespace Project2
{
/// <summary>
/// Summary description for Class.
/// </summary>
class Class
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
myclass a1;

for(int i=0;
i<=10000;i++){
a1=new myclass();
a1.dosomething();
}
}
}
class myclass {
public voiddo
something(){
//...
//...
}

}
}
 
在下面的程序中,将new myclass()动态的赋值给a1,然后执行a1.dosomething(),如果在dosomething()中使用了非托管资源,由于myclass没有释放资源,会不会产生内存泄露?非托管资源应放在myclass的什么地方释放, 如何处理这一类的问题?
退一步说,就算dosomething()没有使用非托管资源,由于.net不能显示的释放对象,循环语句会大量的占用系统资源,运行会非常慢?

using System;
namespace Project2
{
/// <summary>
/// Summary description for Class.
/// </summary>
class Class
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
myclass a1;

for(int i=0;
i<=10000;i++){
a1=new myclass();
a1.dosomething();
}
}
}
class myclass {
public voiddo
something(){
//...
//...
}

}
}
 
象你這樣循環的話﹐如果手工釋放資源﹐那你准備在哪里釋放呢﹖
 
应该不会的,在.NET里面都是类型安全的.而且.NET本身会自动释放所有创建的资源.但这些只是对托管的对象管用,对于非托管的,可能得自己释放资源了.
 
对于使用非托管资源的类,应当实现IDisposable接口。比如数据库连接:
SqlConnection con = new SqlConnection(conString);
con.Open();
...
con.Dispose();
为了保证出现异常时,资源不会泄漏,应当使用try-finally:
SqlConnection con = new SqlConnection(conString);
try
{
con.Open();
...
}
finally
{
con.Dispose();
}
可以使用using语句,简化try-finally:
using (SqlConnection con = new SqlConnection(conString))
{
con.Open();
...
}
 
To redforks,
就算实现了IDisposable接口,对象在什么时候释放非托管资源?在这个对象在构造构数中就打开了数据库连接,不同的方法使用这个相同连接作不同的事,不知道什么时候这个对象不使用,仅仅在调用a1=new myclass();时,才知道上一个对象的生命周期到了
 
To mycwcgr_new:
对于拥有非托管资源的对象,他的生命周期应当由程序员自己管理。
对于一些非共享的资源,用IDisposable结合using语句就可以很简单的完成管理。对于需要在多个对象/多个线程中都需要访问的共享资源,使用资源池,结合定时器的方式管理;尽量使资源的使用局部化。
另外,我觉得打开数据库后,共享数据库连接,是个有问题的做法。首先数据库连接对象是不是线程安全的?其次,打开了游标之后(IDataReader),数据库连接就不能再使用了。而打开游标这个事实,不是所有使用数据库连接对象的代码都知道的,会导致这些代码失败。我想只有无状态的资源才能共享,而数据库连接不是无状态的。所以不能共享。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
602
import
I
顶部