快速业务通道

C++:最强大的.NET语言之内存与资源

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

  对托管C++来说,情节也非常类似,也需要使用一个try-finally语句,但其是Microsoft对C++的扩展。虽然很容易编写一个简单的Using模板类来包装GCHandle,并在模板类的析构函数中调用托管对象的Dispose方法,但托管C++中依然没有C# using语句的对等物。

Using<SqlConnection> connection(new SqlConnection(S"Database=master; Integrated Security=sspi"));

SqlCommand* command = connection->CreateCommand();
command->set_CommandText(S"sp_databases");
command->set_CommandType(CommandType::StoredProcedure);

connection->Open();

Using<SqlDataReader> reader(command->ExecuteReader());

while (reader->Read())
{
 Console::WriteLine(reader->GetString(0));
}

  想一下C++中对资源管理的传统支持,其对C++/CLI也是适用的,但C++/CLI的语言设计犹如为C++资源管理带来了一阵轻风。首先,在编写一个管理资源的类时,对大部分CLR平台语言来说,其中一个问题是怎样正确地实现Dispose模式,它可不像本地C++中经典的析构函数那样容易实现。当编写Dispose方法时,需要确定调用的是基类的Dispose方法--若有的话,另外,如果选择通过调用Dispose方法来实现类的Finalize方法,还必须关注并发访问,因为Finalize方法很可能被不同的线程所调用。此外,与正常程序代码相反,如果Dispose方法实际上是被Finalize方法调用的,还需要小心仔细地释放托管资源。

  C++/CLI并没有与上述情况脱离得太远,但它提供了许多帮助,在我们来看它提供了什么之前,先来快速回顾一下如今的C#和托管C++有多么接近。下例假设Base从IDisposable派生。

class Derived : Base
{
 public override void Dispose()
 {
  try
  {
   //释放托管与非托管资源
  }
  finally
  {
   base.Dispose();
  }
 }

 ~Derived() //实现或重载Object.Finalize方法
 {
  //只释放非托管资源
 }
}
托管C++也与此类似,看起来像析构函数的代码其实是一个Finalize方法,编译器实际上插入了一个try-finally块并调用基类的Finalize方法,因此,C#与托管C++相对容易编写一个Finalize方法,但在编写Dispose方法时,却没有提供任何帮助。程序员们经常使用Dispose方法,把它当作一个伪析构函数以便在代码块末执行一点其他的代码,而不是为了释放任何资源。

   C++/CLI认识到了Dispose方法的重要性,并在引用类型中,使之成为一个逻辑"析构函数"。
ref class Derived : Base
{
 ~Derived() //实现或重载IDisposable::Dispose方法
 {
  //释放托管与非托管资源
 }

 !Derived() //实现或重载IDisposable::Dispose方法
 {
  //只释放非托管资源
 }
};

  对C++程序员来说,这让人感觉更自然了,能像以往那样,在析构函数中释放资源了。编译器会生成必要的IL(中间语言)来正确实现IDisposable::Dispose方法,包括抑制垃圾回收器调用对象的任何Finalize方法。事实上,在C++/CLI中,显式地实现Dispose方法是不合法的,而从IDisposable继承只会导致一个编译错误。当然,一旦类型通过编译,所有使用该类型的CLI语言,将只会看到Dispose模式以其每种语言最自然的方式得以实现。在C#中,可以直接调用Dispose方法,或使用一个using语句--如果类型定义在C#中。那么C++呢?难道要对堆中的对象正常地调用析构函数?此处当然是使用delete操作符了,对一个句柄使用delete操作符将会调用此对象的Dispose方法,而回收对象的内存是垃圾回收器该做的事,我们不需要关心释放那部分内存,

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号