亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? c++:最強大的.net語言之內存與資源.txt

?? 介紹一些有關c/c++的文章 例如:VC++6.0 下搭建 wxWidgets 開發環境 最強大的.NET語言之對象構造 最強大的.NET語言之內存與資源 最強大的.NET語言之裝箱 C++
?? TXT
字號:
C++:最強大的.NET語言之內存與資源 
 
 
文章錄入:7747.Net    責任編輯:7747.Net  更新時間:2006-9-21 10:38:07 1039 
 【字體:小 大】
 
 
當運行環境中包含垃圾回收機制時,區別開內存管理和資源管理,就非常重要了。典型地來說,垃圾回收器只對包含對象的內存之分配與釋放感興趣,它可不關心你的對象是否擁有其他的資源,如數據庫連接或核心對象的句柄。 

  內存管理

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

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

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

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

  資源管理

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

  也許有一點令人驚訝,CLR并沒有對資源管理提供任何顯式運行時支持,CLR不支持類似析構函數的C++概念,而是在 .NET Framework中,把資源管理這種模式,提升到一個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.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++來說,情節也非常類似,也需要使用一個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方法,而回收對象的內存是垃圾回收器該做的事,我們不需要關心釋放那部分內存,只要釋放對象的資源就行了。

Derived^ d = gcnew Derived();
d->SomeMethod()
delete d; 

  如果表達式中傳遞給delete操作符的是一個句柄,將會調用對象的Dispose方法,如果此時再沒有其他對象鏈接到引用類型,垃圾回收器就會釋放對象所占用的內存。如果表達式中是一個本地C++對象,在釋放內存之前,還會調用對象的析構函數。

  毫無疑問,在對象生命期管理上,我們越來越接近自然的C++語法,但要時刻記住使用delete操作符,卻不是件易事。C++/CLI允許對引用類型使用堆棧語義,這意味著你能用在堆棧上分配對象的語法來使用一個引用類型,編譯器會提供給你所期望的C++語義,而在底層,實際上仍是在托管堆中分配對象,以滿足CLR的需要。

Derived d;
d.SomeMethod(); 

  當d超出范圍時,它的Dispose將會被調用,以釋放它所占用的資源。再則,因為對象實際是在托管堆中分配的,所以垃圾回收器會在它的生命期結束時釋放它。來看一個ADO.NET的例子,它與C++/CLI中的概念非常相似。

SqlConnection connection("Database=master; Integrated Security=sspi");

SqlCommand^ command = connection.CreateCommand();
command->CommandText = "sp_databases";
command->CommandType = CommandType::StoredProcedure;

connection.Open();

SqlDataReader reader(command->ExecuteReader());

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
丝袜脚交一区二区| 色88888久久久久久影院野外| 国产精品91一区二区| 91女厕偷拍女厕偷拍高清| 精品成人一区二区| 亚洲主播在线观看| 粉嫩嫩av羞羞动漫久久久 | 欧美一区二区三区四区高清| 国产精品久久一卡二卡| 狠狠色狠狠色综合| 久久久影视传媒| 日韩精品亚洲一区二区三区免费| 粉嫩aⅴ一区二区三区四区| 日韩精品中文字幕在线一区| 午夜精品国产更新| 91免费精品国自产拍在线不卡 | 久热成人在线视频| 欧美三级在线视频| 亚洲一区二区三区影院| 91美女福利视频| 中文字幕日韩欧美一区二区三区| 国产原创一区二区三区| 精品美女被调教视频大全网站| 亚洲午夜三级在线| 欧洲精品视频在线观看| 日韩美女啊v在线免费观看| 波多野结衣中文字幕一区| 亚洲国产精品精华液ab| 国产在线视频一区二区三区| 日韩区在线观看| 在线日韩国产精品| 亚洲第四色夜色| 欧美日韩国产一二三| 五月婷婷综合激情| 日韩一级二级三级| 激情综合网av| 国产日韩欧美精品一区| 成人app下载| 亚洲黄一区二区三区| 在线观看国产日韩| 亚洲chinese男男1069| 欧美三级欧美一级| 久久99久久精品| 欧美国产综合色视频| 色妹子一区二区| 午夜精品一区在线观看| 日韩写真欧美这视频| 国产一区二区视频在线播放| 国产精品日产欧美久久久久| 91麻豆国产自产在线观看| 亚洲va韩国va欧美va精品| 欧美一区二区三区四区视频| 国产激情一区二区三区四区| 亚洲女子a中天字幕| 欧美日韩情趣电影| 极品销魂美女一区二区三区| 日韩一区中文字幕| 欧美美女直播网站| 国产在线视频一区二区| 亚洲柠檬福利资源导航| 91精选在线观看| 大胆欧美人体老妇| 亚洲第一激情av| 精品国产sm最大网站免费看| 成人晚上爱看视频| 亚洲va欧美va人人爽| 精品成人一区二区三区四区| 91免费在线播放| 久久66热re国产| 亚洲乱码国产乱码精品精可以看| 欧美亚洲国产一区在线观看网站| 精品午夜久久福利影院| 一区二区在线观看视频| 精品少妇一区二区三区免费观看| 粉嫩av一区二区三区| 青娱乐精品在线视频| 日韩伦理电影网| 久久久精品免费免费| 欧美一区二区三区不卡| 99精品视频在线播放观看| 成人动漫在线一区| 蜜乳av一区二区| 亚洲综合视频在线观看| 中文字幕不卡一区| 精品噜噜噜噜久久久久久久久试看 | 久久在线观看免费| 欧美午夜精品电影| 97se狠狠狠综合亚洲狠狠| 狠狠色综合日日| 日本不卡一区二区三区| 亚洲一区在线观看网站| 中文字幕一区二区三区四区| 久久中文娱乐网| 日韩精品一区二区在线| 在线成人免费观看| 精品视频一区 二区 三区| 99久久99久久综合| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 97se狠狠狠综合亚洲狠狠| 国产精品亚洲第一区在线暖暖韩国| 日韩精品一区第一页| 午夜一区二区三区视频| 亚洲国产日日夜夜| 亚洲国产人成综合网站| 一区二区三区欧美日| 亚洲一区在线观看免费 | 久久99精品久久只有精品| 天天色天天操综合| 肉色丝袜一区二区| 日韩黄色在线观看| 喷水一区二区三区| 蜜桃精品视频在线观看| 美女一区二区在线观看| 日本大胆欧美人术艺术动态| 青青青伊人色综合久久| 免费视频一区二区| 奇米精品一区二区三区在线观看一| 亚洲妇女屁股眼交7| 午夜国产精品一区| 日韩高清不卡一区二区| 日本中文字幕不卡| 激情五月激情综合网| 国产精品白丝jk白祙喷水网站| 国产精品一卡二卡在线观看| 成人午夜视频免费看| 色欧美乱欧美15图片| 欧美日本韩国一区| 日韩欧美在线综合网| 久久青草欧美一区二区三区| 日本一区二区免费在线 | 久久精品一区八戒影视| 欧美激情一区二区三区不卡| 亚洲欧洲日韩在线| 亚洲国产精品精华液网站| 免费在线观看日韩欧美| 国产乱妇无码大片在线观看| av福利精品导航| 91精品欧美久久久久久动漫| 26uuu亚洲综合色欧美| **性色生活片久久毛片| 日韩成人免费在线| 成人a级免费电影| 国产网站一区二区| 亚洲欧美另类小说| 日本v片在线高清不卡在线观看| 国产毛片精品一区| 91豆麻精品91久久久久久| 欧美大度的电影原声| 国产精品成人一区二区艾草 | 99re这里只有精品视频首页| 欧美日韩免费观看一区三区| 精品美女一区二区三区| 自拍偷自拍亚洲精品播放| 另类人妖一区二区av| 色8久久精品久久久久久蜜| 日韩视频免费观看高清完整版在线观看| 久久综合久色欧美综合狠狠| 亚洲色图欧美激情| 国产在线一区二区综合免费视频| 91免费在线看| 久久精品日韩一区二区三区| 亚州成人在线电影| 不卡av在线网| 国产日韩精品久久久| 午夜精品福利视频网站| 99国产精品国产精品久久| 精品久久久久久最新网址| 亚洲一二三专区| 久久精品国产一区二区三| 91黄色激情网站| 国产精品乱子久久久久| 狠狠v欧美v日韩v亚洲ⅴ| 欧美丰满少妇xxxxx高潮对白| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国产精品视频线看| 国模套图日韩精品一区二区| 欧美剧情片在线观看| 亚洲精品乱码久久久久久| 国产精品影视天天线| 日韩女优视频免费观看| 午夜电影一区二区| 欧美午夜不卡视频| 夜夜揉揉日日人人青青一国产精品| 成人激情小说网站| 国产精品美女久久久久久久网站| 久久91精品国产91久久小草| 日韩亚洲欧美一区二区三区| 日韩高清欧美激情| 欧美高清你懂得| 天堂av在线一区| 欧美另类高清zo欧美| 日韩国产精品大片| 欧美日韩美少妇| 亚洲va韩国va欧美va| 欧美日韩精品一二三区| 偷拍日韩校园综合在线| 欧美一区二区三区免费观看视频| 日韩国产在线一| 日韩一区二区精品在线观看| caoporn国产精品|