亚洲成人伦理_成人午夜视频在线观看_日本免费网站_黄网站色大毛片_超碰97人人人人人蜜桃_久久在线视频


曙海教育集團(tuán)論壇開(kāi)發(fā)語(yǔ)言培訓(xùn)專區(qū)C++語(yǔ)言開(kāi)發(fā) → C++:最強(qiáng)大的.NET語(yǔ)言之內(nèi)存與資源


  共有8066人關(guān)注過(guò)本帖樹(shù)形打印

主題:C++:最強(qiáng)大的.NET語(yǔ)言之內(nèi)存與資源

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個(gè)性首頁(yè) | 博客 | 信息 | 搜索 | 郵箱 | 主頁(yè) | UC


加好友 發(fā)短信
等級(jí):青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊(cè):2010-11-12 11:08:23
C++:最強(qiáng)大的.NET語(yǔ)言之內(nèi)存與資源  發(fā)帖心情 Post By:2010-12-10 15:10:38

IT168技術(shù)文檔】

    當(dāng)運(yùn)行環(huán)境中包含垃圾回收機(jī)制時(shí),區(qū)別開(kāi)內(nèi)存管理和資源管理,就非常重要了。典型地來(lái)說(shuō),垃圾回收器只對(duì)包含對(duì)象的內(nèi)存之分配與釋放感興趣,它可不關(guān)心你的對(duì)象是否擁有其他的資源,如數(shù)據(jù)庫(kù)連接或核心對(duì)象的句柄。

    內(nèi)存管理

    本地C++為程序員提供了超越內(nèi)存管理的直接控制能力,在堆棧上分配一個(gè)對(duì)象,意味著只有在進(jìn)入特定函數(shù)時(shí),才會(huì)為對(duì)象分配內(nèi)存,而當(dāng)函數(shù)返回或堆棧展開(kāi)時(shí),內(nèi)存被釋放。可使用操作符new來(lái)動(dòng)態(tài)地為對(duì)象分配內(nèi)存,此時(shí)內(nèi)存分配在CRT堆中,并且需要程序員顯存地對(duì)對(duì)象指針使用操作符delete,才能釋放它。這種對(duì)內(nèi)存的精確控制,也是C++可用于編寫(xiě)極度高效的程序的原因之一,但如果程序員不小心,這也是內(nèi)存泄漏的原因。另一方面,你不需要求助于垃圾回收器來(lái)避免內(nèi)存泄漏--實(shí)際上這是CLR所采取的方法,而且是一個(gè)非常有效的方法,當(dāng)然,對(duì)于垃圾回收堆,也有其他一些好處,如改進(jìn)的分配效率及引用位置相關(guān)的優(yōu)勢(shì)。所有這一切,都可以在C++中通過(guò)庫(kù)支持來(lái)實(shí)現(xiàn),但除此之處,CLR還提供了一個(gè)單一的內(nèi)存管理編程模型,其對(duì)所有的編程語(yǔ)言都是通用的,想一想與C++中COM自動(dòng)化對(duì)象相交互和調(diào)度數(shù)據(jù)類(lèi)型所需做的一切工作,就會(huì)發(fā)現(xiàn)其重要意義所在--橫跨數(shù)種編程語(yǔ)言的垃圾回收器,作用是非常巨大的。

    為了效率,CLR也保留了堆棧的概念,以便值類(lèi)型可在其上分配,但CLR也提供了一個(gè)newobj中間語(yǔ)言指令,以在托管堆中分配一個(gè)對(duì)象,但此指令只在C#中對(duì)引用對(duì)象使用操作符new時(shí)提供。在CLR中,沒(méi)有與C++中的delete操作符對(duì)應(yīng)的函數(shù),當(dāng)應(yīng)用程序不再引用某對(duì)象時(shí),分配的內(nèi)存最后將由垃圾回收器回收。

    當(dāng)操作符new應(yīng)用于引用類(lèi)型時(shí),托管C++也會(huì)生成newobj指令,當(dāng)然,對(duì)此使用delete操作符是不合法的。這確實(shí)是一個(gè)矛盾,但同時(shí)也證明了為什么用C++指針概念來(lái)表示一個(gè)引用類(lèi)型不是一個(gè)好的做法。

    在內(nèi)存管理方面,除了上述在對(duì)象構(gòu)造一節(jié)討論過(guò)的內(nèi)容,C++/CLI沒(méi)有提供任何新的東西;資源管理,才是C++/CLI的拿手好戲。

    資源管理

    CLR只有在資源管理方面,才能勝過(guò)本地C++。Bjarne Stroustrup的"資源獲取即初始化"的技術(shù)觀點(diǎn),基本定義了資源類(lèi)型的模式,即類(lèi)的構(gòu)造函數(shù)獲取資源,析構(gòu)函數(shù)釋放資源。這些類(lèi)型是被當(dāng)作堆棧上的局部對(duì)象,或復(fù)雜類(lèi)型中的成員,其析構(gòu)函數(shù)自動(dòng)釋放先前分配的資源。一如Stroustrup所言"對(duì)垃圾回收機(jī)制來(lái)說(shuō),C++是最好的語(yǔ)言,主要是因?yàn)樗珊苌俚睦?

    也許有一點(diǎn)令人驚訝,CLR并沒(méi)有對(duì)資源管理提供任何顯式運(yùn)行時(shí)支持,CLR不支持類(lèi)似析構(gòu)函數(shù)的C++概念,而是在 .NET Framework中,把資源管理這種模式,提升到一個(gè)IDisposable核心接口類(lèi)型的中心位置。這種想法源自包裝資源的類(lèi)型,理應(yīng)實(shí)現(xiàn)此接口的單一Dispose方法,以便調(diào)用者在不再使用資源時(shí),可調(diào)用該方法。不必說(shuō),C++程序員會(huì)認(rèn)為這是時(shí)代的倒退,因?yàn)樗麄兞?xí)慣于編寫(xiě)那些缺省狀態(tài)下清理就是正確的代碼。

    因?yàn)楸仨氁{(diào)用一個(gè)方法來(lái)釋放資源,由此帶來(lái)的問(wèn)題是,現(xiàn)在更難編寫(xiě)"全無(wú)異常"的代碼了。因?yàn)楫惓kS時(shí)都可能發(fā)生,你不可能只是簡(jiǎn)單地在一段代碼后,放置一個(gè)對(duì)對(duì)象的Dispose方法的調(diào)用,這樣做的話,就必須要冒資源泄漏的風(fēng)險(xiǎn)。在C#中解決這個(gè)問(wèn)題的辦法是,使用try-finally塊和using語(yǔ)句,在面對(duì)異常時(shí),可提供一個(gè)更可靠的辦法來(lái)調(diào)用Dispose方法。有時(shí),構(gòu)造函數(shù)也會(huì)使用這種方法,但一般的情況是,你必須要記住手工編寫(xiě)它們,如果忘記了,生成的代碼可能會(huì)存在一個(gè)悄無(wú)聲息的錯(cuò)誤。對(duì)缺乏真正析構(gòu)函數(shù)的語(yǔ)言來(lái)說(shuō),是否需要try-finally塊和using語(yǔ)句,還有待論證。

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->using (SqlConnection connection = new SqlConnection("Database=master; Integrated Security=sspi")) ...{  SqlCommand command = connection.CreateCommand();  command.CommandText = "sp_databases";  command.CommandType = CommandType.StoredProcedure;  connection.Open();  using (SqlDataReader reader = command.ExecuteReader())  ...{   while (reader.Read())   ...{    Console.WriteLine(reader.GetString(0));   }  } }

    對(duì)托管C++來(lái)說(shuō),情節(jié)也非常類(lèi)似,也需要使用一個(gè)try-finally語(yǔ)句,但其是Microsoft對(duì)C++的擴(kuò)展。雖然很容易編寫(xiě)一個(gè)簡(jiǎn)單的Using模板類(lèi)來(lái)包裝GCHandle,并在模板類(lèi)的析構(gòu)函數(shù)中調(diào)用托管對(duì)象的Dispose方法,但托管C++中依然沒(méi)有C# using語(yǔ)句的對(duì)等物。 

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->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)); }

支持(0中立(0反對(duì)(0單帖管理 | 引用 | 回復(fù) 回到頂部

返回版面帖子列表

C++:最強(qiáng)大的.NET語(yǔ)言之內(nèi)存與資源








簽名
主站蜘蛛池模板: 国产一级毛片精品完整视频版 | 天天夜天天操 | 亚洲婷婷六月天 | 亚洲高清av在线 | 91精品国产综合久久久久久丝袜 | 国产成人福利 | 中文字幕日本一区二区 | 久久久一区二区 | 欧美激情一区二区 | 日韩性生活网 | 黄色精品| 日韩伦理一区二区 | 国产美女在线免费观看 | 亚洲综合区| 久久久久久av| 久久久久国产精品免费免费搜索 | 日本黄色一级视频 | xx视频在线 | 欧美日韩一区二区三区在线观看 | 国产综合精品一区二区三区 | 在线观看黄色 | 日韩一级二级片 | 亚洲码欧美码一区二区三区 | 午夜欧美日韩 | 欧美一区二区三区在线观看 | 国产做a爱片久久毛片 | 黄色永久免费 | 国产成人91视频 | 午夜私人影院 | 久久久久久成人 | 91精品久久久久久久久久入口 | 精品一区二区久久久久久久网站 | 亚洲成人免费av | 成年视频在线观看 | 日韩欧美在 | 日本午夜免费福利视频 | 一区二区国产在线 | 国产在线精品一区二区三区 | 国产午夜精品理论片a大结局 | 伊人焦久影院 | 99久久精品国产一区二区三区 |