C#&アンマネージDLLマーシャリング 普通の配列の受け取り

くまさん

神社,ダムと温泉好きな「システムアーキテクト」

おすすめ

3件のフィードバック

  1. きん より:

    はじめまして。

    BadImageException の対処方法を探していて貴兄のページを参考にさせていただきました。
    ありがとうございます。

    C# C++ の連携をするのにデータ受渡しに苦労しているので、このページも参考になります(感謝)。

    この例題について質問ですが、
    受け渡すfloat配列は、C++ 側でAllocされていますが、Freeはどうすればよいでしょうか?
    Marshal.Copy(aryXPtr, aryX, 0, aryCount);
    Marshal.Copy(aryYPtr, aryY, 0, aryCount);
    のあとで、
    Marshal.FreeHGlobal(aryX);
    Marshal.FreeHGlobal(aryY);

    でよいのでしょうか?(自信が全然ないのですみません)

  2. くまさん より:

    >>きん さま

    ようこそ!
    うちのサンプルが、参考になってうれしい限りです♪

    >>この例題について質問ですが、
    >>受け渡すfloat配列は、C++ 側でAllocされていますが、Freeはどうすればよいでしょうか?

    C++で確保したメモリは、C++側で開放すべきと思います
    このDLLでは、処理クラスのデストラクタで、
    メモリが確保されていたら、確保分の破棄の処理を行っています

    (m_XArray, m_YArrayはクラスのメンバ変数です)

    if (m_XArray != NULL)
    {
    delete m_XArray;
    }

    if (m_YArray != NULL)
    {
    delete m_YArray;
    }

    と同じコードをデストラクタに挿入してありますです

    また、わからないことがあったらよろしくですぅ 😉

  3. くまさん より:

    【城主注】

    あ~~また,C++側の開放の仕方間違ってる!!

    NG:
    delete m_XArray;
    delete m_YArray;

    OK:
    delete[] m_XArray;
    delete[] m_YArray;

    float配列の動的確保なんで開放は deleteじゃなくてdelete[]が正解
    floatなんで大勢に影響ないけど,気色悪いので念の為(爆

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください