4

C ++/CLIを使用して.NETクラスで正常にラップしたC++プロジェクトがあります。マネージC++でラッパークラスを定義しています。__gcクラスをガベージコレクションするには、クラスにマークを付ける必要がありますか?または、.NET Frameworkは、管理されたクラスであるため、クラスを自動的にGCしますか?

これが現在宣言されている方法です

public ref class Player {

このようなものが必要ですか?

__gc class Player { .. }
4

2 に答える 2

4

MSDNから

クラスまたは構造体のキーワード__gcは、ガベージコレクションされ、その存続期間が共通言語ランタイムによって管理されることを示します。ユーザープログラムでは、削除を明示的に呼び出す必要はありません。

ただし、それでも、クラス内でメモリを割り当てる場合は、割り当てタイプに応じて、deleteまたはfreeを使用してfinalizer内でメモリを解放する必要があります。

public ref class PAWrapper
{
private:
    PAPor *pap;

public:

    PAWrapper()
    {
        pap = new PAPor();
    }

    ~PAWrapper(){this->!PAWrapper();}

    !PAWrapper()
    {
        delete pap;
        pap = NULL;
    }
}

いいえ、必要ありませんが__gc、メモリリークを回避するためにファイナライザー(!PAWrapper())を定義する必要があります。ファイナライザーはGCによって自動的に呼び出されます

于 2013-03-26T08:32:12.923 に答える
4

キーワード__gcは以前のバージョン(IIRC、VS2003まで)で使用されていました。次に、新しいコンテキスト固有のキーワード(ref class、などvalue struct)が追加されました。新しいコンパイラ(VS2005 +)は、新しいキーワードを理解し、使用することを提案します。Contextキーワードref classは、このクラスがマネージクラスであることを示すのに十分です。gcnew管理対象クラスは、キーワードを使用してのみ割り当てることができます。コンパイラはnew、管理対象クラスに使用されるのエラーを発生させます。VC ++(/clr)の場合、スタックセマンティクスも利用できます。

これは、以下も有効であることを意味します。

public ref class SomeClass{};

void foo()
{
    SomeClass cls; // On stack!    
}
于 2013-03-27T06:20:12.180 に答える