在C+中使用数组时的公共模式+/CLI 我对C++有经验,但我只是开始学习C++或CLI。 我经常注意到以下模式: array<String^>^ x; 数组^x;

在C+中使用数组时的公共模式+/CLI 我对C++有经验,但我只是开始学习C++或CLI。 我经常注意到以下模式: array<String^>^ x; 数组^x;,c++,c++-cli,C++,C++ Cli,你们怎么看这个?我的理解是, 这是字符串数组,我们希望它们都位于托管堆上 这就是为什么我们使用字符串^,但我们也希望向量位于托管 堆,这就是为什么我们有 array<something>^. array^。 正确吗?C++cliref类必须位于托管堆上。实际的非托管堆实例被阻止 String和array都是ref class类型,因此它们必须位于托管堆上 为了提醒用户这些是垃圾收集的指针类型,而不是文字或传统的指针类型,C++要求以^结束这些类型 虽然这是多余的(所有array的

你们怎么看这个?我的理解是, 这是字符串数组,我们希望它们都位于托管堆上 这就是为什么我们使用字符串^,但我们也希望向量位于托管 堆,这就是为什么我们有

array<something>^.
array^。

正确吗?

C++cli
ref类必须位于托管堆上。实际的非托管堆实例被阻止

String
array
都是
ref class
类型,因此它们必须位于托管堆上

为了提醒用户这些是垃圾收集的指针类型,而不是文字或传统的指针类型,C++要求以
^
结束这些类型


虽然这是多余的(所有
array
的实例都是
array^
——因此在C#中没有这样的
^
标记),但当您混合使用托管代码和非托管代码时,提醒这是托管类型而不是普通类型可能会有所帮助。

ref class
必须位于托管堆上。实际的非托管堆实例被阻止

String
array
都是
ref class
类型,因此它们必须位于托管堆上

为了提醒用户这些是垃圾收集的指针类型,而不是文字或传统的指针类型,C++要求以
^
结束这些类型


虽然这是多余的(所有
array
的实例都是
array^
——因此在C#中没有这样的
^
标记),但当您混合使用托管代码和非托管代码时,提醒这是托管类型而不是普通类型可能会有所帮助。

在C++/CLI中,您还可以在堆栈上创建托管对象!例如,在执行
Foo^Foo=gcnew Foo()
的过程中,您可以只编写
Foo Foo
,这将在堆栈上创建托管对象(ref类)!如果由类实现,它现在也将自动调用Dispose模式@我不知道:指针是自动调零还是什么的?你能在一些解释它的文档中给我一个链接吗?只有
ref class
字段会自动初始化为默认值(0或nullptr)@jochenkalmbach不,我的意思是当堆栈实例超出范围时,指向它的指针会发生什么?它实际上不在堆栈上。。。。但是当变量超出范围时,会调用dispose。是c#using块的更好版本,也适用于成员变量。在c++/CLI中,您还可以在堆栈上创建托管对象!例如,在执行
Foo^Foo=gcnew Foo()
的过程中,您可以只编写
Foo Foo
,这将在堆栈上创建托管对象(ref类)!如果由类实现,它现在也将自动调用Dispose模式@我不知道:指针是自动调零还是什么的?你能在一些解释它的文档中给我一个链接吗?只有
ref class
字段会自动初始化为默认值(0或nullptr)@jochenkalmbach不,我的意思是当堆栈实例超出范围时,指向它的指针会发生什么?它实际上不在堆栈上。。。。但是当变量超出范围时,会调用dispose。是c#using块的更好版本,它也适用于成员变量。