将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
答案 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;