-1

I am trying to copy unsigned short from native code to managed code, but I get a heap corruption when calling memcpy.

INPUT: unsigned short* input
OUTPUT: array<unsigned short> output

I have the following code and if I set testDataSize is 100 then I don't see corruption. Could someone please shed some light ?

Thanks,

typedef unsigned short uns16;

// DLL Entry Point
void main()
{
    int testDataSize = 600;
    int frSize = testDataSize / 2;


    for (int j = 0; j < 1; j++) 
    {
        uns16* input;
        array<uns16>^ output1;
        array<uns16>^ output2;

        input = new uns16(frSize);
        output1 = gcnew array <uns16>(frSize);
        output2 = gcnew array <uns16>(frSize);

        // initialize
        for (int i = 0; i < frSize; i++)
        {
            input[i] = i;
        }

        //test 1
        Stopwatch^ sw1 = Stopwatch::StartNew();
        //-------------------------------------------------------------------
        array<short>^ frameDataSigned = gcnew array<short>(frSize);
        Marshal::Copy(IntPtr((void*)(input)), frameDataSigned, 0, frameDataSigned->Length);
        System::Buffer::BlockCopy(frameDataSigned, 0, output1, 0, (Int32)(frSize) * 2);
        //-------------------------------------------------------------------
        auto res1 = sw1->ElapsedTicks;

        //test 2
        Stopwatch^ sw2 = Stopwatch::StartNew();
        //-------------------------------------------------------------------
        cli::pin_ptr<uns16> pinnedManagedData = &output2[0];
        memcpy(pinnedManagedData, (void*)(input), frSize * sizeof(uns16));
        //-------------------------------------------------------------------
        auto res2 = sw2->ElapsedTicks;
....
user1296153
  • 575
  • 6
  • 23

1 Answers1

2
int frSize = 300;
input = new uns16(frSize);

This doesn't allocate an array. It allocates a single uint16_t, and sets its value to 300. You need to use square brackets to allocate an array.

input = new uns16[frSize];
David Yaw
  • 27,383
  • 4
  • 60
  • 93