C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: gcnewで生成したオブジェクトのdeleteを禁止する


(過去ログ 41 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■21700 / inTopicNo.1)  gcnewで生成したオブジェクトのdeleteを禁止する
  
□投稿者/ ひであき (1回)-(2008/07/07(Mon) 23:26:11)

分類:[C++/CLI] 

こんばんわ初めて投稿します。
趣味でC++を触っている程度の知識しかありません。

現在、あるクラスのインスタンスを管理するクラスを作りたいと
考えているのですが、そのインスタンスの生成、廃棄を管理クラス
だけで行うためにはどのようにしたらよいでしょうか。

// ライブラリを想定
public ref class Hoge {
internal:
Hoge();
~Hoge();
!Hoge();
};

public class Manager {
// Createするときに内部のList<Hoge ^>か何かに登録する予定
static Hoge^Create();

static void Destory(Hoge ^obj);
}

アプリ側からはCreate,Destoryだけで処理したい。
ところが、デストラクタ、ファイナライザもアクセス可能。。。

引用返信 編集キー/
■21701 / inTopicNo.2)  Re[1]: gcnewで生成したオブジェクトのdeleteを禁止する
□投稿者/ ネタ好き (539回)-(2008/07/08(Tue) 06:40:47)
2008/07/08(Tue) 09:13:30 編集(投稿者)

No21700 (ひであき さん) に返信
残念ながら通常は無理だと思います。
何故ならば、GCにとって必要なメソッドだからです。
GC上でメモリ管理をしては駄目ですよ。
もしそれでもやるというのならば、ピン止めしてGCの対象外である事を明示しなくてはなりません。
でもそれをやると.NETらしくなくなりますし、煩雑性と混乱を呼ぶはめになります。
引用返信 編集キー/
■21702 / inTopicNo.3)  Re[2]: gcnewで生成したオブジェクトのdeleteを禁止する
□投稿者/ 出水 (76回)-(2008/07/08(Tue) 07:27:43)
GCを止めたいって意味なのかな…?
デストラクタやファイナライザをprivate扱いにしたい、って事です?

なんか問題点が見えてこないです
引用返信 編集キー/
■21720 / inTopicNo.4)  Re[3]: gcnewで生成したオブジェクトのdeleteを禁止する
□投稿者/ ひであき (2回)-(2008/07/08(Tue) 15:10:37)
レスありがとうございます。
以下のようなことをしたいのですが。

class Object {
int id;
};

// 一意のidを持ったObjectを管理する
class Manager {
public:
// Objectをgcnewで生成して、一意のidを決めてからreturnする。
static Object ^Create(void);
// 指定されたobjをdeleteする、ただし、obj内のidを内部の空きidリスト
// に返却したい。
static void Destroy(Object ^obj);
};

class Application {
Object ^o;
o = Manager::Create();
delete o; // 勝手にdeleteされるとidが失われる
Manager::Destory(o);
};
引用返信 編集キー/
■21721 / inTopicNo.5)  Re[4]: gcnewで生成したオブジェクトのdeleteを禁止する
□投稿者/ επιστημη (1135回)-(2008/07/08(Tue) 15:15:43)
επιστημη さんの Web サイト
2008/07/08(Tue) 15:20:25 編集(投稿者)

> // 一意のidを持ったObjectを管理する
> class Manager {
> public:
> // Objectをgcnewで生成して、一意のidを決めてからreturnする。
> static Object ^Create(void);
> // 指定されたobjをdeleteする、ただし、obj内のidを内部の空きidリスト
> // に返却したい。
> static void Destroy(Object ^obj);
> };

ManagerがCreateしたObjectを捕まえてる限りガベコレされませんけど。
あ、受け取った側でdeleteされちゃ困るてこと?
デストラクタはprivateにできんかったっけ?

引用返信 編集キー/
■21722 / inTopicNo.6)  Re[4]: gcnewで生成したオブジェクトのdeleteを禁止する
□投稿者/ επιστημη (1136回)-(2008/07/08(Tue) 15:25:34)
επιστημη さんの Web サイト
2008/07/08(Tue) 15:26:23 編集(投稿者)

重複投稿につき削除
引用返信 編集キー/
■21723 / inTopicNo.7)  Re[5]: gcnewで生成したオブジェクトのdeleteを禁止する
□投稿者/ ネタ好き (540回)-(2008/07/08(Tue) 15:36:30)
2008/07/08(Tue) 15:53:45 編集(投稿者)

>あるクラスのインスタンスを管理するクラスを作りたいと
考えているのですが、

privateにすれば済む話だと思うのですが、この条件でprivateに出来ないのでしょうか?
そうだとしたら違うアセンブリにして修飾子をinternalにしましょう。
引用返信 編集キー/
■21747 / inTopicNo.8)  Re[6]: gcnewで生成したオブジェクトのdeleteを禁止する
□投稿者/ Azulean (164回)-(2008/07/08(Tue) 22:52:22)
お断り:解釈的なものなので、実際は異なるかもしれません。

C++/CLIでのデストラクタってIDiposable.Disposeとほぼ同等に扱われるから、privateやinternalにはならないんじゃないかな。
ファイナライザはアクセスレベル関係ないはずです。ユーザが任意には呼べないので。

単純にIDがなくなったことを知りたいのであれば、対象のクラスのデストラクタに、マネージャに通知するようなイベントを呼び出すコードでも入れてあげればいいんじゃないかな。
このイベントはinternalにして、他のアセンブリから見えないようにしておけば特に問題なさそう?
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -