2008-10-14 135 views
39

我偶然發現了這段代碼,我很自豪地去問問作者這是什麼意思。gcnew是什麼?

Hashtable^ tempHash = gcnew Hashtable(iterators_); 

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator(); 

什麼是gcnew以及如何重要的是它爲使用而不是簡單地new? (我也被難住了;我問了那個over here。)

+2

你可以在這裏閱讀一些C++/CLI功能:http://en.wikipedia.org/wiki/C%2B%2B/CLI – 2008-10-14 19:24:20

+0

插入符號'^'在聲明管理型即ie; std :: string * str; //指向std :: string的指針 - 可以是nulptr – user2796283 2016-04-26 10:37:47

回答

56

gcnew是.NET參考對象;使用gcnew創建的對象會自動被垃圾收集;使用gcnew與CLR類型很重要

+0

@ [Chris Jester-Young]:謝謝Chris,這很好,知道如何修復MS鏈接 – 2008-10-14 19:53:32

35

gcnew是一個運算符,就像new運算符一樣,不同之處在於您不必刪除使用它創建的任何內容。它是g arbage c ollected。您使用gcnew創建.Net託管類型,並使用新創建非託管類型。

1

當聲明一個類型時,插入符'^'對C/C++中的'*'起作用;

// pointer to new std::string object -> memory is not garbage-collected 
std::string* strPtr = new std::string; 

// pointer to System::String object -> memory is garbage-collected 
System::String^ manStr = gcnew System::String; 

我描述被管理對象時作爲管理對象可以比作「nullptr」就像在C/C的指針++使用術語「指示器」。 C/C++中的引用無法與'nullptr'進行比較,因爲它是現有對象的地址。

受控對象使用自動引用計數,意思是當它們的引用計數爲零時它們被自動銷燬,儘管如果兩個或多個不可訪問的對象引用彼此,你仍然會有內存泄漏。要警告的是,自動引用計數不是免費的性能明智的,所以明智地使用它。