代码之家  ›  专栏  ›  技术社区  ›  user1296153

使用pin-ptr从本机代码复制到托管代码时堆损坏

  •  -1
  • user1296153  · 技术社区  · 6 年前

    我试图将unsigned short从本机代码复制到托管代码,但在调用memcpy时出现堆损坏。

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

    我有下面的代码,如果我设置testdatasize为100,则不会看到损坏。 有人能给我点光吗?

    谢谢,

    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;
    ....
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   David Yaw    6 年前
    int frSize = 300;
    input = new uns16(frSize);
    

    这不分配数组。它分配一个uint16,并将其值设置为300。需要使用方括号来分配数组。

    input = new uns16[frSize];