【发布时间】:2018-03-14 08:02:51
【问题描述】:
使用带有CLR 选项的 Microsoft C++。
我使用 gcroot 来定义非托管类中数组的托管句柄。
Microsoft gcroot 示例请参见下面的链接。
gcroot < array<double> ^ > xArray;
然后我使用 gcnew 来分配数组。
myClass.xArray = gcnew array<double>(scanProp.nz);
这行得通,我可以根据需要通过传递给第 3 方库托管函数来使用该数组。
问题:之后如何调整数组的大小?
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
【问题讨论】:
-
必须访问托管数组的非托管代码是一种非常重的代码气味。但可以肯定的是,您必须重新分配它,因为 Resize() 必须创建一个新的数组对象。 GC 负责清理战利品,不需要或不需要任何帮助。
标签: arrays class c++-cli managed