忍者ブログ
すずめと一緒に踊りませんか
ブログ内検索
話題ごと
WirelessFreedom
LinkStation (ls-gl)
イーサネットコンバータ
最新コメント
最新トラックバック
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
バーコード
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

       
C++の遺産をC#で使う為に、C++/CLIでラッピングなんてしているわけですが。
ものにも依りますが、おおむね
Vista到来。既存C/C++資産の.NET化を始めよう!
[http://www.atmarkit.co.jp/fdotnet/special/vcppinvista01/vcppinvista01_02.html]

に書いてあるように、
コンストラクタ、デストラクタ、ファイナライザと、メンバ変数としてネイティブクラスへのポインタ、
くらいを持っておけば何とかなるなる。
ただ、
ネイティブ側のクラスが、ばかでかいメモリをヒープに確保するようなものだと、
なんかメモリ不足になることがあった。

例えば、自前でBitmap画像のバイト配列を用意して管理するようなネイティブのクラスを考える。
当然、ネイティブでこのクラスを使う場合には、
newとdeleteは意識して行うか、あるいはstd::auto_ptrとかboost::shared_ptrなんかを使うので、
寿命が明確に定まる。
ので、メモリ不足になるのはそりゃプログラマが悪いぞと。

しかし、これをマネージドに持って行くと話は別で、
なんかマネージドのものだと、勝手にGCが破棄してくれるから、とりあえず作っちゃえ、みたいになるわけです。
.NETにゃdeleteないじゃん。
いや、Dispose使えとかusingに入れろとか言われると耳が痛いのですが、
だってあなた.NETじゃないですか。GCに任せたくなるじゃないですか。
DisposeはGCに任せてはいけないとかいう話は、んまぁ聞いたことはありますが、
んまぁ、上の記事だとデストラクタはファイナライザを呼んでるわけだし。

マネージドでくるんだクラスをnewしては放置、newしては放置してると、
どんどん使用メモリが増えていって、
あるとき突然GCが働いてちゅどーんとメモリが減る。

ところがさ、ときどきこれが失敗するのよねん。
マネージドでくるんだ側のクラスをnew(gcnew)すると、マネージドのコンストラクタが働く。
このコンストラクタで、内部に持ってるネイティブクラスを(ネイティブのヒープに)newする。
このnewが失敗して、std::bad_allocを返す。
そして、これを捕ったCLR(?)がなんとか(名前忘れた。Win32なんとかかんとか)っていう例外を返す。

というような怪奇現象が何度も現れた。
GCの発動が遅すぎて、ネイティブのnewが先走っちゃったと解釈すればよろしいのでしょうか。

定期的に(メモリがあふれる前に)、
System.GC.Collect()
で強制的に手動でGCを発動してあげると、んまぁ、なんか根本的な解決にはなってないけど何とかなった。

そんなこともあるってことで。
全部マネージドの世界に閉じこもってしまえれば楽なのかもしれない。
PR
       
■ この記事にコメントする
お名前
タイトル
文字色
URL
コメント
パスワード
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
■ コメント一覧
■ この記事のトラックバック
この記事にトラックバックする:
ExplorerとInternet Explorerの合わせ技 HOME 有効ではない
Copyright © すずめのおどりあし All Rights Reserved
Powered by ニンジャブログ  Designed by ピンキー・ローン・ピッグ
忍者ブログ / [PR]