我有一个C ++函数,它接受一个数组(double *)作为参数,对数据执行操作并返回指向相同数据的complex *类型的指针。我需要使用c ++ / cli来包装这个函数,但我不确定如何确保.NET最终正确引用内存。例如,如果用户调用类似android:icon="@drawable/ic_launcher"
的函数,我想确保在函数返回时(并且我的Complex[] data = Process(new double[1024]);
超出范围)数据不会被收集,并且当pin_ptr
超出范围时,它会收集垃圾。
我怎样才能得到两个对内存的有效引用,每个引用都是不同类型的?
注意:基础C ++函数工作正常,这是一个.NET C ++ / CLI问题,关于如何获得两个垃圾收集引用到两个不同类型的相同内存。
data
编辑: 这里有一些更多信息,因为每个人都说明显的解决方案就是复制数据。 我正在做的是一个非常大的实际到复杂的就地FFT。数据以双精度数组形式出现,并且基本上保持这种方式(显然值会发生变化),但在完成FFT之后,对数据的正确解释是每对双精度数构成单个数据的实部和虚部。复杂的样本。我想做的FFT的大小对于32位系统来说太大了,但是我不能尽可能地接近它,所以我不想牺牲所需的内存数据的副本。我可以随时将数据作为双精度数处理,但能够将其视为复杂数据会很好,因为这就是FFT之后的真实情况。
答案 0 :(得分:1)
我可能完全误解了您的问题或您的要求,但将原生数组的内容复制到托管数组并让GC完成其工作会不会更简单?
#include <complex>
using namespace System;
using namespace System::Numerics;
std::complex<double>* NativeProcess(double* data, int& size);
public ref class Processor
{
public:
array<Complex>^ Processor::Process(array<double>^ data)
{
if (data == nullptr)
throw gcnew ArgumentNullException("data");
int length = data->Length;
pin_ptr<double> dataPtr = &data[0];
std::complex<double>* dataOut = NativeProcess(dataPtr, length);
array<Complex>^ complexArray = gcnew array<Complex>(length);
for (int idx = 0; idx < length; ++idx)
complexArray[idx] = Complex(dataOut[idx].real(), dataOut[idx].imag());
delete[] dataOut;
return complexArray;
}
};
答案 1 :(得分:0)
我不确定从double转换为Complex。是否有可能将double(基本类型)转换为Complex(管理类型)而不创建新对象?如果您需要更多细节,我可以寻找它。
但是如何:在任何指针指向它之前,你的数据都不会被收集。