/*
* 可及的速やかに破棄したい
* マネージ対象外リソースを持ったクラスのテンプレ
* 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を破棄する */ }
};
これで十分なんだって。