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

C++:大的.NET语言之内存与资源,第1张

C++:大的.NET语言之内存与资源,第2张

内存管理

Local C++为程序员提供了超越内存管理的直接控制能力。在堆栈上分配一个对象意味着只有当进入一个特定的函数时,才会为该对象分配内存,当函数返回或堆栈展开时,才会释放内存。new运算符可用于为对象动态分配内存。此时内存是在CRT堆中分配的,程序员需要在对象指针上显式使用delete操作符来释放它。这种对内存的精确控制也是C++可以用来编写极其高效的程序的原因之一,但如果程序员不小心,这也是内存泄漏的原因。另一方面,你不需要求助于垃圾收集器来避免内存泄漏——事实上,这是CLR采用的方法,而且是非常有效的方法。当然,垃圾收集堆还有其他优势,比如提高分配效率和与引用位置相关的优势。这些都可以通过库支持在C++中实现,但除此之外,CLR还提供了单一的内存管理编程模型,对所有编程语言都是通用的。如果你想想在C++中与COM自动化对象交互和调度数据类型需要做的所有工作,你就会发现它的意义——跨几种编程语言的垃圾收集器,作用巨大。

为了提高效率,CLR还保留了stack的概念,以便值类型可以在其上分配,但CLR也提供了newobj中间语言指令,用于在托管堆中分配一个对象,但该指令仅在C#中使用运算符new引用对象时提供。在CLR中,没有与C++中的delete运算符相对应的函数。当应用程序不再引用某个对象时,分配的内存将最终被垃圾收集器回收。

当运算符new应用于引用类型时,托管C++也会生成newobj指令。当然,为此使用删除操作符是非法的。这确实是一个矛盾,但也证明了为什么用C++指针的概念来表示一个引用类型不是一个好的做法。

在内存管理方面,C++/CLI没有提供任何新的东西,除了上面在对象构造一节中讨论的内容;管理是C++/CLI的特长。

资源管理

CLR只能在资源管理上胜过本地C++。比雅尼·斯特劳斯特鲁普“资源获取就是初始化”的技术观点,基本定义了资源类型的模式,即类的构造函数获取资源,析构函数释放资源。这些类型被视为堆栈上的本地对象或复杂类型的成员,它们的析构函数会自动释放先前分配的资源。正如Stroustrup所说,“对于垃圾收集机制来说,C++是一种语言,主要是因为它产生的垃圾很少。”

也许令人惊讶的是,CLR没有为资源管理提供任何显式的运行时支持。CLR不像析构函数那样支持C++的概念,但是在。NET框架,它将资源管理模式提升到IDisposable核心接口类型的中心。这个想法来自于包装器资源的类型,它应该实现这个接口的单个Dispose方法,以便调用方可以在不再使用资源时调用这个方法。不用说,C++程序员会认为这是时代的倒退,因为他们习惯了写默认清理的代码。

因为必须调用一个方法来释放资源,问题是现在写“无异常”代码更难了。因为异常可能随时发生,所以不能简单地在一段代码后调用对象的Dispose方法。这样做,你必须冒资源泄漏的风险。C#中解决这个问题的方法是使用try-finally块和using语句,这样可以提供一种更可靠的方式,在面对异常时调用Dispose方法。有时候,构造函数也会使用这种方法,但是一般情况下,你一定要记得手写。如果您忘记了,生成的代码中可能会有一个无声的错误。对于缺乏真正析构函数的语言,是否需要try-finally块和using语句还有待论证。

using(SqlConnection connection = new SqlConnection(" Database = master;integrated Security = sspi ")
{
SqlCommand command = connection。create command();
命令。CommandText = " sp _ databases
命令。CommandType = CommandType。存储过程;

联系。open();

使用(SqlDataReader reader = command。ExecuteReader())
{
while(reader。Read())
{
控制台。WriteLine(读者。GetString(0));
}
}
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++:大的.NET语言之内存与资源

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情