東方算程譚

Oriental Code Talk ── επιστημηが与太をこく、弾幕とは無縁のシロモノ。

目次

Blog 利用状況

ニュース

著作とお薦めの品々は

著作とお薦めの品々は
東方熱帯林へ。

あわせて読みたい

わんくま

  1. 東京勉強会#2
    C++/CLI カクテル・レシピ
  2. 東京勉強会#3
    template vs. generics
  3. 大阪勉強会#6
    C++むかしばなし
  4. 東京勉強会#7
    C++むかしばなし
  5. 東京勉強会#8
    STL/CLRによるGeneric Programming
  6. TechEd 2007 @YOKOHAMA
    C++・C++/CLI・C# 適材適所
  7. 東京勉強会#14
    Making of BOF
  8. 東京勉強会#15
    状態遷移
  9. 名古屋勉強会#2
    WinUnit - お気楽お手軽UnitTest

CodeZine

  1. Cで実現する「ぷちオブジェクト指向」
  2. CUnitによるテスト駆動開発
  3. SQLiteで組み込みDB体験(2007年版)
  4. C++/CLIによるCライブラリの.NET化
  5. C# 1.1からC# 3.0まで~言語仕様の進化
  6. BoostでC++0xのライブラリ「TR1」を先取りしよう (1)
  7. BoostでC++0xのライブラリ「TR1」を先取りしよう (2)
  8. BoostでC++0xのライブラリ「TR1」を先取りしよう (3)
  9. BoostでC++0xのライブラリ「TR1」を先取りしよう (4)
  10. BoostでC++0xのライブラリ「TR1」を先取りしよう (5)
  11. C/C++に対応した、もうひとつのUnitTestFramework ─ WinUnit
  12. SQLiteで"おこづかいちょう"
  13. STL/CLRツアーガイド
  14. マージ・ソート : 巨大データのソート法
  15. ヒープソートのアルゴリズム
  16. C++0xの新機能「ラムダ式」を次期Visual Studioでいち早く試す
  17. .NETでマンデルブロ集合を描く
  18. .NETでマンデルブロ集合を描く(後日談)
  19. C++/CLI : とある文字列の相互変換(コンバージョン)
  20. インテルTBBによる選択ソートの高速化
  21. インテルTBB3.0 によるパイプライン処理
  22. Visual C++ 2010に追加されたSTLアルゴリズム
  23. Visual C++ 2010に追加されたSTLコンテナ「forward_list」
  24. shared_ptrによるObserverパターンの実装
  25. .NETでマンデルブロ集合を描く(番外編) ── OpenCLで超並列コンピューティング
  26. StateパターンでCSVを読む
  27. 状態遷移表からStateパターンを自動生成する
  28. 「ソートも、サーチも、あるんだよ」~標準C++ライブラリにみるアルゴリズムの面白さ
  29. インテルTBBの同期メカニズム
  30. なぜsetを使っちゃいけないの?
  31. WPFアプリケーションで腕試し ~C++でもWPFアプリを
  32. C++11 : スレッド・ライブラリひとめぐり
  33. Google製のC++ Unit Test Framework「Google Test」を使ってみる
  34. メールでデータベースを更新するココロミ
  35. Visitorパターンで遊んでみたよ
  36. Collection 2題:「WPFにバインドできる辞書」と「重複を許す検索set」
  37. Visual C++ 2012:stateless-lambdaとSQLiteのぷち拡張
  38. 「Visual C++ Compiler November 2012 CTP」で追加された6つの新機能

@IT

  1. Vista時代のVisual C++の流儀(前編)Vista到来。既存C/C++資産の.NET化を始めよう!
  2. Vista時代のVisual C++の流儀(中編)MFCから.NETへの実践的移行計画
  3. Vista時代のVisual C++の流儀(後編) STL/CLRによるDocument/Viewアーキテクチャ
  4. C++開発者のための単体テスト入門 第1回 C++開発者の皆さん。テスト、ちゃんとしていますか?
  5. C++開発者のための単体テスト入門 第2回 C++アプリケーションの効率的なテスト手法(CppUnit編)
  6. C++開発者のための単体テスト入門 第3回 C++アプリケーションの効率的なテスト手法(NUnit編)

AWARDS


Microsoft MVP
for Visual Developer - Visual C++


Wankuma MVP
for いぢわる C++


Nyantora MVP
for こくまろ中国茶

Xbox

Links

記事カテゴリ

書庫

日記カテゴリ

こうですね、わかります。

/*
 * 可及的速やかに破棄したい
 * マネージ対象外リソースを持ったクラスのテンプレ
 * C++/CLI版
 */

public ref class SampleClass : System::IDisposable {
private:
  char* unmanaged_resource; // マネージ対象外リソース
protected:
  bool disposed; // Dispose()済みならtrue
  // Dispose()後にメソッドが呼ばれたときの用心のため、
  // 各public/protectedメソッドはその処理に先立ちこいつを呼ぶことを推奨する。
  void method() {
    if ( disposed ) {
      throw gcnew System::ObjectDisposedException(
              
this->GetType()->ToString(),
               "has been disposed.");
    }
  }

  // Dispose()の実処理はココで行う
  virtual void Dispose(bool disposing) {
    if ( !disposed ) {
      if ( disposing ) {
        // managed-resourceを持っている
        // ならここでDispose()
      }
      // ここでunmanaged-resourceを廃棄
      delete[] unmanaged_resource;
    }
    disposed = true;
  }

public:
  // コンストラクタ
  SampleClass() {
    unmanaged_resource = new char[100];
    disposed = false;
  }

  // デストラクタ: Dispose() に相当する。
  virtual ~SampleClass() {
    Dispose(true);
    // 後続するFinalize()を抑止する
    System::GC::SuppressFinalize(this); 
  }
  // ファイナライザ: Finalize()に相当する
  !SampleClass() {
    Dispose(false);
  }
};

※ 修正: doDispose → Dispose

じゃないんだってさ!

ref class SampleClass {
public:
  ~SampleClass() { this->!SampleClass(); }
  !SampleClass() { /* unmanaged-resourceを破棄する */ }
};

これで十分なんだって。

投稿日時 : 2008年6月26日 11:01

コメントを追加

# re: こうですね、わかります。 2008/06/26 15:30 渋木宏明(ひどり)

// managed-resourceを持っているならここでDispose()

// ここでunmanaged-resourceを廃棄

は、それぞれ、ReleaseManagedResource(), ReleaseUnmanagedResource() という private メンバを作って、そこで行うようにしてます。

(その方がコードの使い回しの時にちょびっとだけ分かりやすいかな、程度の理由ですが)

# re: こうですね、わかります。 2008/06/26 15:38 渋木宏明(ひどり)

1個忘れてた。

> virtual void doDispose(bool disposing) {

System.ComponentModel 的には void Dispose(bool) を実装がマストなはず。

Component 派生する時とそうでない時でコード書き分けるのも面倒&まぎらわしいので、Dispose(bool) の方がよろしんじゃないかと思いますデス。

# re: こうですね、わかります。 2008/06/26 17:31 黒龍

MC++、C++/CLIはスコープ抜けたらDisposeがイケる生かした言語なんすよね。usingでマシにはなりましたが今でもやっぱり強力に見えます。

# re: こうですね、わかります。 2008/06/27 0:04

通りすがりですが、C++/CLIで COM インタフェースのラッパを書いていたので参考になりますです。
恥ずかしながら、SuppressFinalize() なんて初めて知りました…。
Release(Un)ManagedResource() に分けるアイデアは可読性が上がりそうで特に良いですね。
両方とも早速真似して組み込んでみたいと思います。
(*´ω`*)

> スコープ抜けたらDisposeがイケる
単なる構文糖と言われればそれまでですが、例えようのない便利さですね。

値型と gcnew される物が明確に分かれてる所も個人的には好みです。
こちらについては結構賛否が分かれるかも知れませんけどね。

# re: こうですね、わかります。 2008/06/27 11:38 επιστημη

> void Dispose(bool) を実装がマスト

修正しました。ありがとです。

> スコープ抜けたらDisposeがイケる

うんうん。
gcnew したやつを delete すれば デストラクタ(=Dispose)動いてくれっし。

template使えるしSTL/CLR使えるしもぉサイコーっすよ
# これでlambdaがつけばおなかいっぱいです

# re: こうですね、わかります。 2008/06/27 13:52 επιστημη

...ありゃ。

doDispose(bool)→Dispose(bool) したら

error C2605: 'Dispose' :
このメソッドは、マネージ クラス
で予約されています
デストラクタを定義しようとしましたか?

だとさ。
引数があるからデストラクタとカブりゃしねーはずなのに。

ひょとしてコンパイラのバグ?

# re: こうですね、わかります。 2008/06/27 14:42 渋木宏明(ひどり)

>doDispose(bool)→Dispose(bool) したら

まさか、C++/CLI では Dispose(bool) を自動的に実装してくれちゃう???

# re: こうですね、わかります。 2008/06/27 14:48 渋木宏明(ひどり)

Dispose メソッドの実装:
--ここから--
++ プログラマはこのトピックを使用しないでください。代わりに、Destructors and Finalizers in Visual C++ を参照してください。.
--ここまで--

ですと。

どうも、IDisposable を明示的に継承する必要もないみたいです?

# re: こうですね、わかります。 2008/06/27 21:51 渋木宏明(ひどり)

>じゃないんだってさ!

おもろーw

でこれ、ちょっとやりすぎな気もしません?>C++/CLI

# re: こうですね、わかります。 2008/06/28 7:44 επιστημη

んー...

// equivalent Dipose pattern
void Dispose(bool disposing) {
 if ( disposing ) {
  ~T();
 } else {
  !T();
 }
}

とあるから、
~SampleClass() {
/* 明示的に捨てたいmanaged-resourceがあるならここで */
 this->!SampleClass();
}
!SampleClass() {
 /* unmanaged-resourceを破棄する */
}

てことになっちゃうんでしょけど。
...このとき!SampleClassは二度呼ばれるかも知れんのかしら。
ならば"返しすぎ"に気をつけなあかんですねぃ。

# re: こうですね、わかります。 2008/06/30 14:13 渋木宏明(ひどり)

>...このとき!SampleClassは二度呼ばれるかも知れんのかしら。

IDisposable.Dispose() は何度でも呼び出される可能性があり、それに備えなくておかねばならないです。

# re: こうですね、わかります。 2008/06/30 16:41 επιστημη

> 何度でも呼び出される可能性があり

そか。んじゃ delete p; したら p = 0; しとかなあかんわけや。

# JPCsAMxznqyzNkkeYF 2014/07/19 16:33 http://crorkz.com/

yWzXQA I loved your article post.Much thanks again.

# ZsqHtiglYXDWF 2014/08/05 5:20 http://crorkz.com/

sor2n3 wow, awesome blog article.Really looking forward to read more. Fantastic.

# GnxGmUmiESuMfjV 2014/08/28 2:29 http://crorkz.com/

AJ5gBj I will right away grasp your rss as I can't find your e-mail subscription link or newsletter service. Do you have any? Please let me understand in order that I may just subscribe. Thanks.

# uCBFKfomEeH 2014/09/09 20:38 http://www.designingdigitally.com

I simply couldn't depart your website before suggesting that I really enjoyed the usual info a person supply to your visitors? Is going to be again ceaselessly to check up on new posts

# Wow, amazing blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your web site is excellent, let alone the content! 2018/09/16 1:27 Wow, amazing blog layout! How long have you been b

Wow, amazing blog layout! How long have you been blogging for?

you made blogging look easy. The overall look of your web site is
excellent, let alone the content!

# Hello there! Do you know if they make any plugins to safeguard against hackers? I'm kinda paranoid about losing everything I've worked hard on. Any suggestions? 2018/10/01 12:37 Hello there! Do you know if they make any plugins

Hello there! Do you know if they make any plugins to safeguard against hackers?
I'm kinda paranoid about losing everything I've worked hard on. Any suggestions?

# Yesterday, while I was at work, my sister stole my iphone and tested to see if it can survive a 40 foot drop, just so she can be a youtube sensation. My apple ipad is now destroyed and she has 83 views. I know this is completely off topic but I had to 2018/10/08 8:07 Yesterday, while I was at work, my sister stole my

Yesterday, while I was at work, my sister stole my iphone
and tested to see if it can survive a 40 foot drop, just so she can be a youtube sensation. My apple ipad is now destroyed and she has 83 views.
I know this is completely off topic but I had to share it with someone!

タイトル
名前
URL
コメント