<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    Rss & SiteMap

    曙海教育集團論壇 http://www.bjzhda.cn

    曙海教育集團論壇
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
    [瀏覽完整版]

    標題:C++:最強大的.NET語言之內(nèi)存與資源

    1樓
    wangxinxin 發(fā)表于:2010-12-10 15:10:38

    IT168技術文檔】

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

        內(nèi)存管理

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

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

        當操作符new應用于引用類型時,托管C++也會生成newobj指令,當然,對此使用delete操作符是不合法的。這確實是一個矛盾,但同時也證明了為什么用C++指針概念來表示一個引用類型不是一個好的做法。

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

        資源管理

        CLR只有在資源管理方面,才能勝過本地C++。Bjarne Stroustrup的"資源獲取即初始化"的技術觀點,基本定義了資源類型的模式,即類的構造函數(shù)獲取資源,析構函數(shù)釋放資源。這些類型是被當作堆棧上的局部對象,或復雜類型中的成員,其析構函數(shù)自動釋放先前分配的資源。一如Stroustrup所言"對垃圾回收機制來說,C++是最好的語言,主要是因為它生成很少的垃圾。"

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

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

    <!-- 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));   }  } }

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

    <!-- 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)); }
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

    Copyright © 2000 - 2009 曙海教育集團
    Powered By 曙海教育集團 Version 2.2
    Processed in .03223 s, 2 queries.
    主站蜘蛛池模板: 国产极品美女视频| 日韩国产欧美精品在线| 少妇高潮喷水久久久久久久久久 | 免费人成在线观看视频播放 | 2018高清国产一区二区三区| 妞干网免费在线视频| 久久超碰97人人做人人爱| 欧美日韩福利视频| 又爽又刺激的视频| 青青青手机视频| 国产精品青草久久久久福利99| 中文字幕人妻中文AV不卡专区 | 欧美a在线观看| 免费1夜情网站| 3d姐弟关系风车动漫(p)_在线观看| 少妇人妻偷人精品一区二区| 久久香蕉国产线看观看精品yw| 欧美日本高清在线不卡区| 午夜理论影院第九电影院| 被男按摩师添的好爽在线直播| 国产精品视频视频久久| 一边摸边吃奶边做爽动态| 日产精品久久久久久久性色| 亚洲午夜爱爱香蕉片| 毛片免费在线播放| 古月娜下面好紧好爽| 97久久婷婷五月综合色d啪蜜芽| 巨大一下一寸挤进校花| 久久精品卫校国产小美女| 机机对机机120分免费无遮挡 | 91在线精品中文字幕| 天天射天天干天天操| 亚洲另类第一页| 毛片免费视频播放| 啦啦啦www免费视频| 色欲香天天天综合网站| 国产成版人视频网站免费下| 91看片淫黄大片.在线天堂| 在线播放免费人成视频在线观看| 中文字幕亚洲综合久久男男| 无码人妻精品中文字幕免费东京热|