VMime Book 日本語訳 第4章 4.1
2020-07-01 K.OHWADA
原文
VMime Book: A Developer’s Guide To VMime
https://www.vmime.org/public/documentation/book/vmime-book.pdf
第4章 基本
Basics
ページ内 目次
4.1 参照カウント
4.1.1 はじめに
4.1.2 参照カウントされたオブジェクトのインスタンス化
4.1.3 スマートポインタの使用
4.1 参照カウント
Referencecounting
4.1.1 はじめに
Introduction
バージョン0.7.2cvs以降、VMimeはスマートポインタを使用してメモリ管理を簡素化します。
スマートポインタはRAII1に依存しているため、オブジェクトが使用されなくなったときにオブジェクトを削除(メモリを解放)する必要はありません。
オブジェクトへの参照を所有するには、2つの可能性があります。
オブジェクトへの強力な参照を所有できます。
この参照を保持している限り、オブジェクトは破棄されません。 または、オブジェクトへの弱い参照を所有することもできます。 オブジェクトへの強い参照を誰も所有していない場合、オブジェクトは破棄される可能性があります。
その場合、弱い参照は無効になります。
オブジェクトへの最後の強い参照が解放されるとすぐに、オブジェクトは破棄されます。
同時に、、すべての弱参照(存在する場合)は自動的にNULLを指すように設定されます。
VMimeでは、これら2つのタイプの参照はそれぞれvmime :: sharedptrおよびvmime :: weakptrとして知られています。
注:2013年11月以降、スマートポインターの古い、煩わしい実装から、より標準的な実装に切り替えました。
Boost共有ptr <>実装、またはC ++ 11でコンパイルする場合は標準のC ++実装です。
変更点は次のとおりです。
vmime::ref <> is replaced with vmime::shared ptr <> vmime::weak ref <> is replaced with vmime::weak ptr <> vmime::create <> is replaced with vmime::make shared <>
4.1.2 参照カウントされたオブジェクトのインスタンス化
Instanciatingreference-countedobjects
VMimeでは、参照カウントをサポートするすべてのオブジェクトはvmime :: objectクラスを継承します。
このクラスは、カウンターのインクリメント/デクリメントとオブジェクトのライフサイクルの管理を担当します。
新しいオブジェクトインスタンスへのスマートポインタを作成する場合は、new演算子の代わりに関数vmime :: makesharedを使用する必要があります。
リスト4.1:スマートポインターとオブジェクトの作成
Smarts pointers and creating objects
class myObject : public vmime::object { public : myObject(const vmime:: string& name) : mname(name) { } void sayHello() { std::cout << ”Hello ” << mname<< std::endl; } private : vmime::string mname; }; int main() { vmime::shared ptr <myObject> obj = vmime::make shared <myObject>(”world”); obj−>sayHello ( ) ; return 0; } // Here, ’obj’ gets automatically destroyed
4.1.3 スマートポインタの使用
Usingsmartpointers
スマートポインタは、コピー可能、割り当て可能、および比較可能です。
通常の(「生の」)C ++ポインタを使用するのと同じように使用できます(たとえば、!ptr、ptr!= NULL、ptr-> method()、∗ ptr ...と記述できます)。
型の安全性も保証されており、vmime :: sharedptrおよびvmime :: weak ptrオブジェクトで静的cast()、動的cast()、およびconst cast()に相当するものを使用してキャストスマートポインターを入力できます。
リスト4.2:スマートポインターのキャスト
Casting smart pointers
class myBase : public vmime::object { } class myObject : public myBase { } vmime: : shared ptr <myObject> obj = vmime: : make shared <myObject>(); // Implicit downcast vmime::shared ptr <myBase> base = obj; // Explicit upcast vmime::shared ptr <myObject> obj2 = vmime::dynamicCast <myObject>(base);
弱参照は、参照サイクル(それ自体を直接または間接的に参照するオブジェクト)を解決するために使用されます。
次の例は、参照カウントの一般的な問題を示しています。
class parent : public vmime::object { public : void createChild(vmime::shared ptr <child> c) { m child = c; } private : vmime::shared ptr <child> m child; }; class child : public vmime::object { public : child(vmime::shared ptr <parent> p) : m parent(p) { } private : vmime::shared ptr <parent> m parent; }; int main() { vmime::shared ptr <parent> p = vmime::make shared <parent>(); vmime::shared ptr <child> c = vmime::make shared <child>(); p−>setChild(c); }
この例では、main()を終了するときにpもcも削除されません。
これは、pがcを介して間接的にそれ自体を指しているためであり、その逆も同様です。
解決策は、親への弱参照を使用することです。
vmime::weak ptr <parent> m parent;
親または子を弱参照にする決定は純粋に意味論的であり、コンテキストとオブジェクト間の関係に依存します。親が削除されると、子のm親メンバーがNULLを指すことに注意してください。
参照カウントの詳細については、ウィキペディアをご覧ください。
http://en.wikipedia.org/wiki/Referencecounting