3

「Person」という独自のオブジェクト クラスのグローバル ベクトルを作成したいと考えています。ただし、コンパイラは次のように述べています。

    error C2039: '{dtor}' : is not a member of 'System::IDisposable'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::IDisposable'

だから私はIDisposableを実装する方法を調べました(これは主に管理されていないリソースに使用されることがわかっています)が、まだ次のように実装できないようです:

ref class Globals : System::IDisposable
{  
public: 
  static cliext::vector<Person^> person_data = gcnew cliext::vector<Person^>;
    void Dispose()
    {
         delete person_data;
    }
}; 

私が得る2つのエラーは次のとおりです。

error C2605: 'Dispose' : this method is reserved within a managed class
1>        did you intend to define a destructor?
error C3766: 'Globals' must provide an implementation for the interface method 'void System::IDisposable::Dispose(void)'
1>        c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::IDisposable::Dispose'
4

5 に答える 5

3

IDisposable から明示的に派生させる必要はありません。MSDN docoに従って、次のパターンを使用します。

ref class Globals
{
public:
    static cliext::vector<Person^> person_data = gcnew cliext::vector<Person^>;
    !Globals() // finalizer
    {
        delete person_data;
    {
protected:
    ~Globals() // destructor calls finalizer
    {
        this->!Globals();
    }
};
于 2010-02-08T04:31:17.377 に答える
1

デストラクタを使用します。C++/CLI では ~ClassName() は Dispose() であり、!ClassName() は C# の ~ClassName() と同等です。あなたの場合:

ref class Globals : System::IDisposable
{  
public: 
    static cliext::vector<Person^> person_data = gcnew cliext::vector<Person^>;
    void ~Globals()
    {
        delete person_data;
    }
}; 
于 2010-02-07T17:51:18.687 に答える
0

直接またはデストラクタを介して Dispose() を自分で実装する必要はありません。暗黙的に生成されたデストラクタは、すべてのメンバー オブジェクトを既に破棄しています。IDisposable インターフェイスは自動的に追加されます。明示的に言及しないでください。

次に、person_data がハンドル (gcnew で作成されたインスタンスに設定する必要があります) であるか、メンバー オブジェクト セマンティクス (スタック セマンティクスのように、コンストラクターは親オブジェクトのコンストラクターによって自動的に呼び出される) であるかを決定する必要があります。親オブジェクトの有効期間が終了したときに自動的に呼び出されるデストラクタであり、「->」の代わりに「.」を使用してメンバーにアクセスします)。

また、「Globals」のすべてのインスタンス間で共有される person_data のコピーが 1 つ必要ですが、破棄される最初のインスタンスによって破棄され、他のインスタンスは無効な参照 (破棄されたオブジェクトへの参照) を保持したままになりますか? ここでシングルトンのアンチパターンを使用しようとしているようですが、正しいですか?

于 2010-02-23T16:18:06.643 に答える
0

http://www.codeproject.com/KB/mcpp/cppclidtors.aspxに示されているファイナライザーを使用します。

于 2010-02-07T22:45:33.763 に答える
-1

From C++/CLI in Action C++/CLI Dispose パターンには次のルールがあります (言い換え):

  • Dispose(bool)クラスにファイナライザまたはデストラクタがある場合、値に基づいてファイナライザまたはデストラクタを呼び出すコンパイラが生成 しboolます。
  • d'tor (~type) しかない場合、コンパイラは Dispose(true) を呼び出すため、d'tor が呼び出されます。
  • ファイナライザー (!type) しかない場合、コンパイラーは Dispose(false) を呼び出すため、ファイナライザーが呼び出されます。

また、2 番目の規則について: コンパイラはIDisposable(生成により) インターフェイスを実装しますDispose()。次にSuppressFinalize、ファイナライザーが呼び出されないようにするために使用します。

私はあなたのコードに対してこれを行いましたが、それをコンパイルする唯一の方法は、person_data をインスタンス メンバーにすることでした。静的なときに発生したエラーはerror C2039: '{dtor}' : is not a member of 'System::IDisposable'、あまり意味がありません。

deleteまた、マネージド オブジェクトであるため、person_data ベクトルも必要ですか? 多分あなたはそうかもしれませんが、私は言うのに十分なcliextを使用していません.

編集おそらく、この記事の最初の段落に答えがあります(強調は私のものです):

メンバー変数を静的として宣言し、アプリケーションを開始すると、コンパイラはそのメンバーのコピーを作成します。このメンバーは、プログラムの実行中にコンパイラによって維持されます。上記の車両変数のように、クラスのインスタンスを宣言する場合、静的メンバーは オブジェクトの一部ではありません。コンパイラは、使用するかどうか、クラス変数を宣言するかどうかにかかわらず、静的メンバーを作成して維持します。

于 2010-02-08T18:07:50.303 に答える