3

次のように割り当てられたメモリを削除すると、「アクセス違反の読み取り場所」例外が発生します。

Visual Studio 2010 (ツールセット: v100) C++ コンパイラに対してコンパイルされたネイティブ dll があります。

マネージ ラッパーは、ポインターへの参照 (double *&myArray) をネイティブ dll 関数呼び出しの 1 つに渡します。これにより、動的配列が内部的に作成され、データが初期化されます。

ただし、マネージド ラッパーが delete [] myArray を呼び出してラッパーを解放しようとすると、例外がスローされます。ネイティブdllに解放を依頼すると、正常に動作しているようです。

例外が発生するのは、保護されたネイティブ dll アドレス空間が原因ですか? v90 ツールセットでネイティブ dll をコンパイルすると、ラッパーは例外なく配列を削除するように見えますが、これは奇妙なことです。

このようなユースケースでメモリを削除する最良の方法は何ですか?

//Managed.cpp
void InitializeData()
{
    double *myArray;
    myNativeObj->InitializeArray(myArray);
    delete[] myArray; // <-- Exception here
}

//UnManaged.cpp
void InitializeArray(double *& myArray)
{
    myArray = new double[get_length()];
    //Initialize data to my array.
}

ありがとう、ムダシル

4

1 に答える 1

4

1 つの C++ ランタイム (v100) で割り当て、別の (v90) で解放しています。それはただトラブルを求めているだけです。

delete[]呼び出し元と同じ DLL を呼び出す必要がありますnew[](または、少なくとも同じランタイム ライブラリを使用する別の DLL から)。これは複雑で厄介ですか?はい; それが、COM (そして .NET) が発明された理由です。

于 2013-03-08T04:47:00.187 に答える