取一个数组<double> ^并返回指向同一内存的数组<complex> ^

时间:2015-12-01 21:38:38

标签: arrays casting c++-cli

我有一个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之后的真实情况。

2 个答案:

答案 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(管理类型)而不创建新对象?如果您需要更多细节,我可以寻找它。

但是如何:在任何指针指向它之前,你的数据都不会被收集。