如何调整定义为:gcroot <array <double> ^&gt;的数组的大小

时间:2018-03-14 08:02:51

标签: arrays class c++-cli managed

将Microsoft C ++与CLR选项一起使用。 我使用 gcroot 来定义非托管类中数组的托管句柄​​。

请参阅下面的链接,了解Microsoft gcroot 示例。

gcroot < array<double> ^ >  xArray;

然后我使用 gcnew 来分配数组。

myClass.xArray = gcnew array<double>(scanProp.nz);

这很有效,我可以通过传递给第三方库管理函数来根据需要使用该数组。

问题:之后如何调整数组大小?

System::Array::Resize不接受 gcroot 数组。

我想过用同样的“Array”变量再次调用 gcnew ,让垃圾收集释放前一个数组。

问题:

如果使用相同的变量两次调用 gcnew ,会发生什么?

第一次通话是否释放了内存?

实施例

myClass.xArray = gcnew array<double>(100);

myClass.xArray = gcnew array<double>(1000);

如下所示:https://docs.microsoft.com/en-us/cpp/dotnet/how-to-declare-handles-in-native-types#see-also

1 个答案:

答案 0 :(得分:2)

标准警告:虽然可以在C ++ / CLI中编写应用程序的主体,甚至使用WinForms在C ++ / CLI中编写GUI,但不建议这样做。 C ++ / CLI适用于互操作场景:C#或其他.Net代码需要与非托管C ++接口,C ++ / CLI可以提供两者之间的转换。因此,C ++ / CLI具有C ++的所有复杂性,C#的所有复杂性以及它自身的一些复杂性。对于主要开发,如果您需要托管代码,建议将C#与WinForms或WPF一起使用,如果您想要非托管,则建议使用带有MFC的C ++。

首先,没有真正的&#34; resize&#34;一个.Net数组。根据定义,.Net数组有一个在创建时固定的大小。 Array::Resize方法实际上是创建一个具有所需大小的新数组,并将所有数据从旧数组复制到新数组。

不允许您使用Array::Resize致电gcroot,因为Resize会在C#,ref中使用跟踪引用参数^% C ++ / CLI)。

您可以将gcroot复制到本地(非gcroot)变量,在其上调用Array::Resize,然后将其重新分配给gcroot

gcroot<array<double>^> xArray;

int newsize = ...;

array<double>^ temp = xArray;
Array::Resize(temp, newsize);
xArray = temp;

然而,Array::Resize没有什么特别的,你可以自己做。

gcroot<array<double>^> xArray;

int newsize = ...;

array<double>^ newArray = gcnew array<double>(newsize);
Array::Copy(xArray, 0, newArray, 0, Math::Min(xArray->Length, newsize));
xArray = newArray;