1

Managed C から遅延データを作成し、C# で UI に使用するという問題があります。

次に例を示します。

マネージド側:

public ref class c1
{
public:
    c1(void);
    ~c1(void);
    String ^Name;
    double dtata;
};


public ref class c2
{
public:
    c2(void);
    ~c2(void);
    !c2();
    String ^Name;
    List<c1^> ^arrData;

    void CreateData();
    void Clear();

};

void c2::CreateData()
{
    arrData=gcnew List<c1^>();
    for(int i=0;i<1000000;i++)
    {
        c1^ d=gcnew c1;
        arrData->Add(d);
    }
}
void c2::Clear()
{
    if(arrData)
    {
        delete arrData;
        arrData=nullptr;
    }
    GC::Collect();
}

C#側:

void Test()
{
using (c2 cx = new c2())
       {
         cx.CreateData();
         cx.Clear();
         cx.Dispose();

        }
}

結果は、Test() 関数を呼び出した後、メモリが 4MB から 13MB に上昇します。

問題は、cx がメモリから解放されない理由です。

見てくれてありがとう

4

1 に答える 1

0

C++/CLI の場合、参照型のデストラクタはリソースの確定的なクリーンアップを実行します。ファイナライザーはアンマネージ リソースをクリーンアップし、デストラクタによって確定的に、またはガベージ コレクターによって非確定的に呼び出すことができます。これを参照してください。

したがって、ファイナライザーを実装してメモリを解放する必要があります。

于 2012-11-29T02:35:42.873 に答える