64

我偶然发现了这段代码,并且很自豪地去问作者这是什么意思。

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();

gcnew使用它而不是简单地使用它是什么以及有多重要new?(我也被插入符号难住了;我在这里问过这个问题。)

4

3 回答 3

79

gcnew用于 .NET 引用对象;使用 gcnew 创建的对象会自动被垃圾回收;将 gcnew 与 CLR 类型一起使用很重要

于 2008-10-14T19:18:43.290 回答
49

gcnew是一个运算符,就像new运算符一样,只是你不需要delete用它创建任何东西;这是垃圾收集的。您用于创建 .Net 托管类型和创建非托管类型。gcnewnew

于 2008-10-14T19:19:19.937 回答
6

在声明类型时,插入符号 '^' 的作用与 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”进行比较,因为它是现有对象的地址。

托管对象使用自动引用计数,这意味着当它们的引用计数为零时它们会被自动销毁,尽管如果两个或多个无法访问的对象相互引用,您仍然会有内存泄漏。请注意,自动引用计数在性能方面并不是免费的,因此请明智地使用它。

于 2016-04-26T11:04:18.390 回答