C++/CLI について語ろうぜ Part2at TECH
C++/CLI について語ろうぜ Part2 - 暇つぶし2ch751:デフォルトの名無しさん
08/01/13 11:45:06
ファイナライザスレッドは独立したスレッドなのでどのみちスレッドセーフは必要だろう

752:デフォルトの名無しさん
08/01/13 13:40:31
ファイナライザ中でthisに属するオブジェクトも生存は保証されていないしね
本当に最後の手段なんだから、基本的にはGC任せにしない方がいいよ

753:デフォルトの名無しさん
08/01/13 13:43:49
値型メンバは確実に生存してるぜ? その値型が持つ参照型はともかく

754:デフォルトの名無しさん
08/01/13 13:48:15
>>751-752
ありがとうございます。

明示的にDisposeてことになると思うんですが、
そうなるとDisposeしなければならないインスタンスを持つクラスがデータ構造の奥深くにあると
どんどんDispose呼び出しが感染していって親クラスのとこまで行ってしまいますよね。

面倒くさいなぁと思いつつも、仕方が無いなぁとも感じてるんですが
やっぱりそんなもんですかね…

755:デフォルトの名無しさん
08/01/13 23:19:17
アンマネージリソースを取り扱う以上、これは仕方ねっス。
頭切り替えるしかねっス。
ちなみにアンマネージリソース絡みでSafeHandleてのもあるんスが、
これの経緯とか調べるとさらに頭痛のタネが増えるのでオススメっす。

756:デフォルトの名無しさん
08/01/19 09:08:52
C++/CLIのメソッド引数に%をつけることについて質問があります。
マネージ型の配列や構造体をメソッドに渡すとき、”^”をつけますが、 この渡し方で配列や構造体の”ポインタ”が渡されると思っていました。
”^”の引数があるメソッドを持ったクラスライブラリをVBで参照したら “ByVal”となっていました。

ここで質問ですが、”^”でなく”^%”としなければ配列や構造体が 値渡し(配列全体がCopy?)になるのでしょうか?%をつける、 という概念がC++/CLIで現れたため悩んでいます。
できるならば 配列や構造体は値渡しでなく、アドレス渡し、配列渡しをしたいのですが・・・


757:デフォルトの名無しさん
08/01/19 09:13:22
^は参照型 そのまま渡すと参照をコピー
%はC++の&、C#のref/outに当たる参照渡し
「参照型 参照渡し」で調べればいいよ

758:デフォルトの名無しさん
08/01/19 09:54:02
>>757
ありがとうございます。調べてみました。参照型の^引数はアドレスをコピー、参照型の^%渡しはアドレスを参照渡しする、ということですね。
ということは参照型の場合、どちらの方法で渡してもパフォーマンスに大きな影響はないということでしょうか。
参照型と参照渡しの違いを理解しないといけないのですね。

759:デフォルトの名無しさん
08/01/19 10:52:27
.NETで参照渡しはあんまり使わないよ
参照で渡すことが多いんだったら初めから参照型にする

760:デフォルトの名無しさん
08/01/20 22:59:01
TryParseとかあるじゃん

761:デフォルトの名無しさん
08/01/22 21:33:21
スレ立ったのが2006年とかC++/CLIは使われてないの?
今からやるならC#のがいいかね?

762:デフォルトの名無しさん
08/01/22 22:06:34
アンマネージC++もC#も使えるようになった上で、
もしも必要に迫られたときにやっと登場する言語だからね

763:デフォルトの名無しさん
08/01/22 22:54:30
俺は間違っても#なんか使わん。意地でCLI

764:デフォルトの名無しさん
08/01/22 22:55:23
シーナンバー

765:デフォルトの名無しさん
08/01/26 16:42:52
>>761
そりゃ今からやるならC#だな
それよりVB.NETがいいに決まってるけどw
少なくともC++/CLIなんて論外だ
まあ.NETやること自体が間違いかもしれないが・・・

766:デフォルトの名無しさん
08/01/29 01:51:49
なぜVBを推すのか

767:デフォルトの名無しさん
08/02/03 23:32:44
ref じゃないクラスで managed なクラスのイベント捕まえようとしてるのだけど
やり方がわからないので教えてください。

ref class hoge {
 event EventHandler ^ev;
};

class hoge_wrapper {
 hoge ^_hoge;
 void OnHogeEv(System::Object ^o, System::EventArgs ^);
 hoge_wrapper(hoge ^_hoge) {
  this->_hoge = _hoge;
  _hoge->ev += gcnew System::EventHandler (this, &hoge_wrapper::OnHogeEv);
 }
};

こんなコードを書いているのだけど EventHandler のコンストラクターでC3364のコンパイルエラーがでて怒られます。

768:デフォルトの名無しさん
08/02/03 23:52:38
>767
そりゃ、混合型は駄目だろ
ネイティブはネイティブ、マネージドはマネージドで扱わないと

769:デフォルトの名無しさん
08/02/04 00:25:09
あ、hoge_wrapper::_hoge の型は
gcroot<hoge ^> _hoge;
って宣言してました。転記ミスです。


770:デフォルトの名無しさん
08/02/04 00:59:04
いや、そこもそうだけど、gcnew しているイベント・ハンドラにネイティブの
ポインタ this を渡してるだろ?
マネージドでイベントアダプタみたいな物を作ったら?

771:デフォルトの名無しさん
08/02/05 01:13:10
MAKE_DELIGATE っていうのを見つけて、試してみたら意図したとおりに動くみたいです。
中身を見てみたら 770 さんの言うとおりの動きなのかな?

とりあえず解決しましたー。ありがとです。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch