什么是gcnew?

Owe*_*wen 53 .net c++-cli

我偶然发现了这段代码,我很自豪地去问作者这意味着什么.

Hashtable^ tempHash = gcnew Hashtable(iterators_);

IDictionaryEnumerator^ enumerator = tempHash->GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

gcnew使用它而不仅仅是简单的是什么,有多重要new?(我也被插入符号困扰;我在这里过这个问题.)

Ste*_*owe 69

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

  • 出于好奇,对 CLR 类型使用 `gcnew` 有多重要?静态声明 CLR 类型是否可以(即使用 `System::String` 而不是 `System::String^`)?它会在其生命周期/范围结束时正确解除分配吗? (2认同)

Joe*_*orn 41

gcnew是一个操作符,就像new操作符一样,除了你不必删除用它创建的任何东西.这是 arbage Ç ollected.您可以使用gcnew创建.Net托管类型,使用gcnew创建非托管类型.

  • upvoted(不是你需要积分),因为我们同时发布了相同的答案 (6认同)

use*_*283 5

声明类型时,脱字号'^'与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;
Run Code Online (Sandbox Code Playgroud)

在描述托管对象时,我使用术语“指针”,因为就像C / C ++中的指针一样,可以将托管对象与“ nullptr”进行比较。C / C ++中的引用不能与“ nullptr”进行比较,因为它是现有对象的地址。

受管对象使用自动引用计数,这意味着当它们的引用计数为零时,它们将被自动销毁,尽管如果两个或多个无法访问的对象相互引用,则仍然会发生内存泄漏。请注意,自动引用计数并不是明智的自由表现,因此请明智地使用它。