aboutsummaryrefslogtreecommitdiff
path: root/files/ja/mozilla/tech/xpcom/using_nscomptr
diff options
context:
space:
mode:
Diffstat (limited to 'files/ja/mozilla/tech/xpcom/using_nscomptr')
-rw-r--r--files/ja/mozilla/tech/xpcom/using_nscomptr/frequently_asked_questions/index.html91
-rw-r--r--files/ja/mozilla/tech/xpcom/using_nscomptr/getting_started_guide/index.html294
-rw-r--r--files/ja/mozilla/tech/xpcom/using_nscomptr/index.html24
-rw-r--r--files/ja/mozilla/tech/xpcom/using_nscomptr/reference_manual/index.html523
-rw-r--r--files/ja/mozilla/tech/xpcom/using_nscomptr/status,_recent_changes,_and_plans/index.html36
5 files changed, 0 insertions, 968 deletions
diff --git a/files/ja/mozilla/tech/xpcom/using_nscomptr/frequently_asked_questions/index.html b/files/ja/mozilla/tech/xpcom/using_nscomptr/frequently_asked_questions/index.html
deleted file mode 100644
index 1edb362717..0000000000
--- a/files/ja/mozilla/tech/xpcom/using_nscomptr/frequently_asked_questions/index.html
+++ /dev/null
@@ -1,91 +0,0 @@
----
-title: Frequently Asked Questions
-slug: Mozilla/Tech/XPCOM/Using_nsCOMPtr/Frequently_Asked_Questions
-tags:
- - XPCOM
-translation_of: Mozilla/Tech/XPCOM/Using_nsCOMPtr/Frequently_Asked_Questions
----
-<p>
-</p><p>このセクションは、もしあなたが壊れたビルドを直したり、即答できる明らかな疑問を持っていたり、あるいは <a href="ja/Using_nsCOMPtr/Reference_Manual">リファレンスマニュアル</a> を読む時間がない場合に役に立つでしょう。この FAQ は、通常は適切な答えへ直接的に参照するだけです。もしあなたが単に <code>nsCOMPtr</code> について学ぶことを期待しているのであれば、<a href="ja/Using_nsCOMPtr/Getting_Started_Guide">スタートガイド</a> にもっと良い紹介があります。
-</p><p>FAQ は、探しているものを早く見つけやすくするために複数のセクションに分かれています。 ほとんどの場合、答えは上記のリファレンスマニュアルを参照しているだけです。 同じことを 2 度説明する必要はありません <code><span class="nowiki">:-)</span></code>
-</p>
-<h3 id=".E3.83.93.E3.83.AB.E3.83.89.E6.99.82.E3.81.AE.E3.82.A8.E3.83.A9.E3.83.BC" name=".E3.83.93.E3.83.AB.E3.83.89.E6.99.82.E3.81.AE.E3.82.A8.E3.83.A9.E3.83.BC"> ビルド時のエラー </h3>
-<p>ビルドが壊れました。エラーがあなた自身のコードでもなく、あなたのプラットフォームのコードでもなく、<code>nsCOMPtr</code>の 中で起こっており、そしてあなたはそれを疑っています。あなたは正しい場所を見ています。
-</p>
-<h4 id="nsCOMPtr_.E3.81.A8.E7.94.9F.E3.81.AE_.5BXP.5DCOM_.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.82.92.E6.AF.94.E8.BC.83.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.99" name="nsCOMPtr_.E3.81.A8.E7.94.9F.E3.81.AE_.5BXP.5DCOM_.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.82.92.E6.AF.94.E8.BC.83.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.99"> <code>nsCOMPtr</code> と生の [XP]COM インタフェースポインタを比較しています </h4>
-<h4 id="nsCOMPtr_.E3.82.92.E5.BE.8C.E3.81.AB.E5.AE.A3.E8.A8.80.E3.81.97.E3.81.A6.E3.81.84.E3.82.8B.E3.82.AF.E3.83.A9.E3.82.B9.E3.81.AB.E5.AF.BE.E3.81.97.E3.81.A6.E5.AE.A3.E8.A8.80.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.99" name="nsCOMPtr_.E3.82.92.E5.BE.8C.E3.81.AB.E5.AE.A3.E8.A8.80.E3.81.97.E3.81.A6.E3.81.84.E3.82.8B.E3.82.AF.E3.83.A9.E3.82.B9.E3.81.AB.E5.AF.BE.E3.81.97.E3.81.A6.E5.AE.A3.E8.A8.80.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.99"> <code>nsCOMPtr</code> を後に宣言しているクラスに対して宣言しています </h4>
-<h4 id="XPCOM_.E3.81.A8.E3.83.AA.E3.83.B3.E3.82.AF.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.9B.E3.82.93" name="XPCOM_.E3.81.A8.E3.83.AA.E3.83.B3.E3.82.AF.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.9B.E3.82.93"> XPCOM とリンクしていません </h4>
-<h4 id="nsCOMPtr.h_.E3.82.92.E3.82.A4.E3.83.B3.E3.82.AF.E3.83.AB.E3.83.BC.E3.83.89.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.9B.E3.82.93" name="nsCOMPtr.h_.E3.82.92.E3.82.A4.E3.83.B3.E3.82.AF.E3.83.AB.E3.83.BC.E3.83.89.E3.81.97.E3.81.A6.E3.81.84.E3.81.BE.E3.81.9B.E3.82.93"> nsCOMPtr.h をインクルードしていません </h4>
-<h4 id="NSCAP_FEATURE_DEBUG_PTR_TYPES_.E3.81.AE.E8.A8.AD.E5.AE.9A.E3.81.8C.E9.81.95.E3.81.84.E3.81.BE.E3.81.99" name="NSCAP_FEATURE_DEBUG_PTR_TYPES_.E3.81.AE.E8.A8.AD.E5.AE.9A.E3.81.8C.E9.81.95.E3.81.84.E3.81.BE.E3.81.99"> <code>NSCAP_FEATURE_DEBUG_PTR_TYPES</code> の設定が違います </h4>
-<h3 id=".E5.AE.9F.E8.A1.8C.E6.99.82.E3.81.AE.E3.82.A8.E3.83.A9.E3.83.BC" name=".E5.AE.9F.E8.A1.8C.E6.99.82.E3.81.AE.E3.82.A8.E3.83.A9.E3.83.BC"> 実行時のエラー </h3>
-<h4 id="NS_ASSERTION_.22QueryInterface_needed.22" name="NS_ASSERTION_.22QueryInterface_needed.22"> <code>NS_ASSERTION</code> "QueryInterface needed" </h4>
-<h4 id="NS_PRECONDITION_.22You_can.27t_dereference_a_NULL_nsCOMPtr_with_operator-.3E.28.29.22" name="NS_PRECONDITION_.22You_can.27t_dereference_a_NULL_nsCOMPtr_with_operator-.3E.28.29.22"> <code>NS_PRECONDITION</code> "You can't dereference a NULL nsCOMPtr with operator-&gt;()" </h4>
-<h4 id="NS_PRECONDITION_.22You_can.27t_dereference_a_NULL_nsCOMPtr_with_operator.2A.28.29.22" name="NS_PRECONDITION_.22You_can.27t_dereference_a_NULL_nsCOMPtr_with_operator.2A.28.29.22"> <code>NS_PRECONDITION</code> "You can't dereference a NULL nsCOMPtr with operator*()" </h4>
-<h3 id=".E3.81.A9.E3.81.86.E3.82.84.E3.81.A3.E3.81.A6..." name=".E3.81.A9.E3.81.86.E3.82.84.E3.81.A3.E3.81.A6..."> どうやって... </h3>
-<h4 id="nsCOMPtr_.E3.82.92.E5.88.9D.E6.9C.9F.E5.8C.96.E3.81.99.E3.82.8B.E3.81.AE.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F" name="nsCOMPtr_.E3.82.92.E5.88.9D.E6.9C.9F.E5.8C.96.E3.81.99.E3.82.8B.E3.81.AE.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F"> <code>nsCOMPtr</code> を初期化するのですか? </h4>
-<h4 id="nsCOMPtr_.E3.81.8C.E3.82.B9.E3.82.B3.E3.83.BC.E3.83.97.E3.82.92.E6.8A.9C.E3.81.91.E3.82.8B.E5.89.8D.E3.81.AB.E3.81.9D.E3.82.8C.E3.82.92_Release_.E3.81.99.E3.82.8B.E3.81.AE.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F" name="nsCOMPtr_.E3.81.8C.E3.82.B9.E3.82.B3.E3.83.BC.E3.83.97.E3.82.92.E6.8A.9C.E3.81.91.E3.82.8B.E5.89.8D.E3.81.AB.E3.81.9D.E3.82.8C.E3.82.92_Release_.E3.81.99.E3.82.8B.E3.81.AE.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F"> <code>nsCOMPtr</code> がスコープを抜ける前にそれを <code>Release</code> するのですか? </h4>
-<p>それに <code>0</code> を代入してください。<code>nsCOMPtr</code> が新しい値を取る時は、古い値があれば、いつもそれを <code>Release</code> します。値 <code>0</code> を割り当てるということは、<code>NULL</code> の生のポインタを割り当てるのと同じようなことです。古い対象は、<code>Release</code> されます。(より詳しくは、<a href="ja/Using_nsCOMPtr/Reference_Manual#.E5.88.9D.E6.9C.9F.E5.8C.96.E3.81.A8.E4.BB.A3.E5.85.A5">初期化と代入</a> を見てください。)
-</p><p>ただし、これには小さなパフォーマンス上のペナルティがあることに注意してください。<code>nsCOMPtr</code> は、デストラクタの処理の中で、その時持つ値を <code>Release</code> しようとします。最良の解決法は、<code>nsCOMPtr</code> の生存期間をその参照を保持したい期間だけに調整することです。例えば、この例ではブロックを使っています。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 最も効率的な枠組は、|nsCOMPtr| がちょうどその参照を</span>
-<span class="comment">// 保持する必要のある期間だけのスコープを設定することです。</span>
-
-nsresult
-SomeLongFunction( nsIBar* aBar )
- {
- nsresult rv;
- <span class="comment">// ...</span>
-
- {
- <span class="comment">// |nsIFoo| インタフェースは、短期間だけ必要です。</span>
- <span class="comment">// そのため、その生存期間をブロック文の中で</span>
- <span class="comment">// 宣言して、制御します。</span>
-
- nsCOMPtr&lt;nsIFoo&gt; foo( do_QueryInterface(aBar, &amp;rv) );
- if ( foo )
- foo-&gt;DoSomeFooThing();
-
- <span class="comment">// |foo| がスコープをはずれました。そのため、ここで |Release| が実行されます。</span>
- }
-
- <span class="comment">// ...ここには |nsIFoo| を必要としない多くの事柄があります。</span>
-
- return rv;
- }
-</pre>
-</td></tr></tbody></table>
-<p>編集者注: この議論を <a href="ja/Using_nsCOMPtr/Reference_Manual#.E5.8A.B9.E7.8E.87.E6.80.A7.E3.81.A8.E6.AD.A3.E7.A2.BA.E6.80.A7">効率性</a>のセクションへ移動し、ここからリンクを張ります。
-</p>
-<h4 id="nsCOMPtr_.E3.81.AE.E3.83.AA.E3.83.BC.E3.82.AF.E3.82.92.E4.BD.9C.E3.82.8B.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B_.28.E3.83.87.E3.83.90.E3.83.83.E3.82.B0.E3.83.86.E3.82.B9.E3.83.88.E3.81.AE.E3.81.9F.E3.82.81.29_.EF.BC.9F" name="nsCOMPtr_.E3.81.AE.E3.83.AA.E3.83.BC.E3.82.AF.E3.82.92.E4.BD.9C.E3.82.8B.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B_.28.E3.83.87.E3.83.90.E3.83.83.E3.82.B0.E3.83.86.E3.82.B9.E3.83.88.E3.81.AE.E3.81.9F.E3.82.81.29_.EF.BC.9F"> <code>nsCOMPtr</code> のリークを作るのでしょうか (デバッグテストのため) ? </h4>
-<h4 id=".E7.94.9F.E3.81.AE_.5BXP.5DCOM_.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.82.92.E3.80.8C.E5.85.A5.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF.E3.81.A8.E3.81.97.E3.81.A6.E4.BD.BF.E3.81.86_getter_.E3.82.92.E5.91.BC.E3.81.B9.E3.81.B0.E3.82.88.E3.81.84.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.EF.BC.9F" name=".E7.94.9F.E3.81.AE_.5BXP.5DCOM_.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.82.92.E3.80.8C.E5.85.A5.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF.E3.81.A8.E3.81.97.E3.81.A6.E4.BD.BF.E3.81.86_getter_.E3.82.92.E5.91.BC.E3.81.B9.E3.81.B0.E3.82.88.E3.81.84.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.EF.BC.9F"> 生の [XP]COM インタフェースポインタを「入出力」パラメタとして使う getter を呼べばよいのでしょうか? </h4>
-<h4 id="nsIFoo.2A_.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF.E3.81.A7.E8.A8.AD.E5.AE.9A.E3.81.99.E3.82.8B_getter_.E3.82.92.E5.91.BC.E3.81.B9.E3.81.B0.E3.82.88.E3.81.84.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.EF.BC.9F" name="nsIFoo.2A&amp;_.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF.E3.81.A7.E8.A8.AD.E5.AE.9A.E3.81.99.E3.82.8B_getter_.E3.82.92.E5.91.BC.E3.81.B9.E3.81.B0.E3.82.88.E3.81.84.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.EF.BC.9F"> <code>nsIFoo*&amp;</code> パラメタで設定する getter を呼べばよいのでしょうか? </h4>
-<h4 id=".E3.81.9D.E3.81.AE.E7.B5.90.E6.9E.9C.E3.82.92_AddRef_.E3.81.97.E3.81.AA.E3.81.84_getter_.E3.82.92.E5.91.BC.E3.81.B9.E3.81.B0.E3.82.88.E3.81.84.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.3F" name=".E3.81.9D.E3.81.AE.E7.B5.90.E6.9E.9C.E3.82.92_AddRef_.E3.81.97.E3.81.AA.E3.81.84_getter_.E3.82.92.E5.91.BC.E3.81.B9.E3.81.B0.E3.82.88.E3.81.84.E3.81.AE.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.3F"> その結果を <code>AddRef</code> しない getter を呼べばよいのでしょうか? </h4>
-<p>インタフェースポインタを返すどの {{ mediawiki.external('XP') }}COM 関数 (getter) も、そのポインタに対して <code>AddRef</code> をすでに呼び出していなければいけません。 もしそれが行われないのであれば、おそらくそれをバグとして報告すべきでしょう。 この問題を解決するのに使うどのコードパターンに対しても、このようにコメントすべきです。 例えば、<code><span class="comment">// 警告: この getter は 結果を AddRef() していません。</span></code> もし getter が新しいポインタを関数の復帰値として返すのであれば、心配いりません。
-</p>
-<h3 id=".E4.B8.80.E8.88.AC" name=".E4.B8.80.E8.88.AC"> 一般 </h3>
-<h4 id="nsCOMPtr_.E3.81.AF.E3.80.81.E3.82.B3.E3.83.BC.E3.83.89.E3.82.92.E8.86.A8.E5.BC.B5.E3.81.95.E3.81.9B.E3.81.BE.E3.81.99.E3.81.8B.EF.BC.9F" name="nsCOMPtr_.E3.81.AF.E3.80.81.E3.82.B3.E3.83.BC.E3.83.89.E3.82.92.E8.86.A8.E5.BC.B5.E3.81.95.E3.81.9B.E3.81.BE.E3.81.99.E3.81.8B.EF.BC.9F"> <code>nsCOMPtr</code> は、コードを膨張させますか? </h4>
-<h4 id="nsCOMPtr_.E3.81.AF.E9.80.9F.E3.81.84.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F_.E3.82.BF.E3.82.A4.E3.83.88.E3.81.AA.E3.83.AB.E3.83.BC.E3.83.97.E3.81.AE.E4.B8.AD.E3.81.A7.E3.82.82.E4.BD.BF.E3.81.88.E3.81.BE.E3.81.99.E3.81.8B.EF.BC.9F" name="nsCOMPtr_.E3.81.AF.E9.80.9F.E3.81.84.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F_.E3.82.BF.E3.82.A4.E3.83.88.E3.81.AA.E3.83.AB.E3.83.BC.E3.83.97.E3.81.AE.E4.B8.AD.E3.81.A7.E3.82.82.E4.BD.BF.E3.81.88.E3.81.BE.E3.81.99.E3.81.8B.EF.BC.9F"> <code>nsCOMPtr</code> は速いですか? タイトなループの中でも使えますか? </h4>
-<h3 id=".E5.8F.82.E8.80.83.E6.96.87.E7.8C.AE.E4.B8.80.E8.A6.A7" name=".E5.8F.82.E8.80.83.E6.96.87.E7.8C.AE.E4.B8.80.E8.A6.A7"> 参考文献一覧 </h3>
-<h4 id="Web_.E3.83.AA.E3.82.BD.E3.83.BC.E3.82.B9" name="Web_.E3.83.AA.E3.82.BD.E3.83.BC.E3.82.B9"> Web リソース </h4>
-<ul><li> {{ Source("xpcom/glue/nsCOMPtr.h", "nsCOMPtr.h") }} と {{ Source("xpcom/glue/nsCOMPtr.cpp", "nsCOMPtr.cpp") }} は、<code>nsCOMPtr</code>のソースです。<a class="external" href="http://lxr.mozilla.org/">LXR</a> を使って、<code>nsCOMPtr</code>のソースをオンラインで調べることができます。このコードを探検するのは、心臓が弱い人にとっても、冒険ではありません。
-</li><li> <a href="ja/XPCOM_ownership_guidelines">COM の所有のガイドライン</a>
-</li><li> <a class="external" href="http://www.develop.com/dbox/cxx/InterfacePtr.htm">Interface Pointers Considered Harmful</a> - Don Box 著 - "The C++ Report" 1995 年 9 月号初出記事
-</li><li> <a class="external" href="http://www.develop.com/dbox/cxx/SmartPtr.htm">COM Smart Pointers Even More Harmful</a> - Don Box 著 - "The C++ Report" 1996 年 2 月号初出記事のフォローアップ
-</li></ul>
-<h4 id=".E6.9B.B8.E7.B1.8D" name=".E6.9B.B8.E7.B1.8D"> 書籍 </h4>
-<ul><li> <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201634465">Essential COM</a> - Don Box 著
-</li><li> <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201379686">Effective COM</a> - Don Box 他著
-</li><li> <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201889544">The C++ Programming Language (3rd Edition)</a> - Bjarne Stroustrup 著
-</li><li> <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201924889">Effective C++ (2nd Edition): 50 Specific Ways to Improve Your Programs and Designs</a> - Scott Meyers 著
-</li><li> <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/020163371X">More Effective C++ : 35 New Ways to Improve Your Programs and Designs</a> - Scott Meyers 著
-</li><li> <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201310155">Effective C++ CD: 85 Specific Ways to Improve Your Programs and Designs</a> - Scott Meyers 著
-</li></ul>
-<h4 id=".E4.BA.BA.E3.80.85" name=".E4.BA.BA.E3.80.85"> 人々 </h4>
-<ul><li> <a class="external" href="http://www.develop.com/dbox/">Don Box</a> 長い間 COM プログラミングについて書いてきた頭のいい人です。
-</li></ul>
-<div class="noinclude">
-</div>
-{{ languages( { "en": "en/Using_nsCOMPtr/Frequently_Asked_Questions" } ) }}
diff --git a/files/ja/mozilla/tech/xpcom/using_nscomptr/getting_started_guide/index.html b/files/ja/mozilla/tech/xpcom/using_nscomptr/getting_started_guide/index.html
deleted file mode 100644
index 826f85c35a..0000000000
--- a/files/ja/mozilla/tech/xpcom/using_nscomptr/getting_started_guide/index.html
+++ /dev/null
@@ -1,294 +0,0 @@
----
-title: Getting Started Guide
-slug: Mozilla/Tech/XPCOM/Using_nsCOMPtr/Getting_Started_Guide
-tags:
- - XPCOM
-translation_of: Mozilla/Tech/XPCOM/Using_nsCOMPtr/Getting_Started_Guide
----
-<p> </p>
-<p>もしあなたが <code>nsCOMPtr</code> を前に使ったことがないのであれば、このセクションは、あなたにピッタリです。もしあなたがすでに <code>nsCOMPtr</code> に慣れ親しんでいるのであれば、<a href="/ja/Using_nsCOMPtr/Reference_Manual" title="ja/Using_nsCOMPtr/Reference_Manual">リファレンスマニュアル</a> あるいは <a href="/ja/Using_nsCOMPtr/Frequently_Asked_Questions" title="ja/Using_nsCOMPtr/Frequently_Asked_Questions">FAQ</a> まで読み飛ばしたいかもしれません。心配しないでください。スタートガイドは短いです。</p>
-<h3 id=".E3.81.AF.E3.81.98.E3.82.81.E3.81.AB" name=".E3.81.AF.E3.81.98.E3.82.81.E3.81.AB">はじめに</h3>
-<h4 id="nsCOMPtr.E3.81.A8.E3.81.AF.E4.BD.95.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F" name="nsCOMPtr.E3.81.A8.E3.81.AF.E4.BD.95.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F"><code>nsCOMPtr</code>とは何ですか?</h4>
-<p><code>nsCOMPtr</code>はリークを防ぐのを助けるツールです。</p>
-<p><code>nsCOMPtr</code> は「スマートポインタ」です。これは、文法的には通常の C や C++ の通常のポインタのように振舞うテンプレートクラスです。つまり、<code>*</code> や <code>-&gt;</code> を使って、それが指すものを取り出すことができます。<code>nsCOMPtr</code> は、XPCOM オブジェクトを指す生の C++ ポインタとは違い、<code>AddRef</code>、<code>Release</code> と <code>QueryInterface</code> をあなたのために管理してくれるという点でスマートです。<code>nsCOMPtr</code> は、以下のソースファイルで定義されています。</p>
-<ul> <li><code><a href="https://dxr.mozilla.org/mozilla-central/source/xpcom/glue/nsCOMPtr.h" rel="custom">xpcom/glue/nsCOMPtr.h</a></code></li> <li><code><a href="https://dxr.mozilla.org/mozilla-central/source/xpcom/glue/nsCOMPtr.cpp" rel="custom">xpcom/glue/nsCOMPtr.cpp</a></code></li>
-</ul>
-<p>...ただ、まだそこを見たくはないは思わないでしょうけど。</p>
-<p><code>nsCOMPtr</code> を使うことで、生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタを使うよりも、短く、きれいで、明確で、安全なコードを書くことができます。</p>
-<h4 id=".5BXP.5DCOM_.E3.81.AE.E5.9F.BA.E6.9C.AC_.E6.89.80.E6.9C.89.E6.A8.A9.E3.81.A8.E5.8F.82.E7.85.A7.E3.82.AB.E3.82.A6.E3.83.B3.E3.83.88" name=".5BXP.5DCOM_.E3.81.AE.E5.9F.BA.E6.9C.AC:_.E6.89.80.E6.9C.89.E6.A8.A9.E3.81.A8.E5.8F.82.E7.85.A7.E3.82.AB.E3.82.A6.E3.83.B3.E3.83.88">[XP]COM の基本: 所有権と参照カウント</h4>
-<p>これは、 <a href="/ja/XPCOM">XPCOM</a> の基本的な事項に関する軽い記事です。あなたはすでに(<a href="/ja/XPCOM">XPCOM</a> について)知っている必要がありますし、この短いセクションにざっと目を通せるようにすべきです。もしあまり馴染みのない事が書いてあるのであれば、あなたはまだ <code>nsCOMPtr</code> を読む準備ができていません。COM の背後の基本的ルールと論証については、以下の情報が有用です。<a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201634465">Essential COM</a> (<a class="external" href="http://www.develop.com/dbox/">Don Box</a> 著)。Don Box は、COM について、より詳細なこと、わな、落とし穴について、<a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201379686">Effective COM</a> で述べています。あなたは C++ についての適切な知識も持っているべきです。おそらくこのトピックについてとても助けになる 3 冊の本は、Bjarne Stroustrup の <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201889544">The C Programming Language</a>、Scott Meyers の <a class="external" href="http://www.amazon.com/exec/obidos/ASIN/0201924889">Effective C</a>、<a class="external" href="http://www.amazon.com/exec/obidos/ASIN/020163371X">More Effective C</a> です。</p>
-<p>すべての <a href="/ja/XPCOM">XPCOM</a> オブジェクトは、ヒープに割り当てられます。クライアントは、そのようなオブジェクトの実装について多くを知ることはできません。クライアントは「インタフェース」へのポインタを通じてのみ、それを参照します。すなわち、ポインタの静的な型は抽象基底クラスへのポインタであり、指されている実際のオブジェクトは、抽象基底クラスから派生しているクラスです。その <a href="/ja/XPCOM">XPCOM</a> オブジェクトは、「インタフェースを実装する」と言われます。クライアントのオブジェクトへの参照は、一般的に「インタフェースポインタ」と呼ばれています。</p>
-<p>オブジェクトは、たくさんのインタフェースを実装するかもしれません。それぞれのインタフェースについて、(少なくとも概念的には) 別々に、「参照のカウント」が行われます。つまり、インタフェースはそれを参照しているクライアントの数を保持しているということです。カウントが 0 になった時、インタフェースは自分自身を<code>削除する</code>ことができます。クライアントには、この参照カウントの厳密さを保つことが求められています。そのため、インタフェースへの参照が獲得された時は参照カウントのインクリメントを行い、またそれを使わなくなった時は参照カウントのデクリメントを行わなければなりません。これを容易にするため、すべてのインタフェースは、メンバ関数 <code>AddRef</code>、<code>Release</code> を提供する抽象基底クラスから継承しています。</p>
-<p><a href="/ja/XPCOM">XPCOM</a> の一つの規則は、インタフェースポインタを作成するか、返すかするどの関数もそれに対して、すでに <code>AddRef</code> を実行していなければならないことです。呼び出し側は、参照をいつまでも保持することができ、いらなくなったら、<code>Release</code> を呼びます。インタフェースへの最後のポインタに対して、<code>Release</code> が呼ばれると、インタフェース (従って、通常は基となるオブジェクトも) は、自分自身を削除します。インタフェースに対する未解決の <code>AddRef</code> がある限り、オブジェクトは存在し続けます。<code>Release</code> を呼び忘れると、オブジェクトはリークし、すなわち、オブジェクトの記憶領域は決して取り戻されません。リークは、悪いことです。<code><span class="nowiki">:-)</span></code></p>
-<p><code>AddRef</code> と <code>Release</code> の呼び出しを通じた参照を<strong>所有する参照</strong>と呼びます。それは、基となるオブジェクトに権利を持ちます。そのオブジェクトは、所有する参照がその権利を放棄するまで無くなりません。全ての参照が所有する参照である必要はありません。実際、もし二つのオブジェクトが何らかの形で (一時的にでも) お互いを所有しあうことになった場合、所有の輪を断ち切るなんらかの`例外的'メカニズムなしで、それらのオブジェクトを取り戻すのは、難しくなります。ドキュメント <a href="/ja/XPCOM_ownership_guidelines" title="ja/XPCOM_ownership_guidelines">COM の所有のガイドライン</a> は、所有権が必要になった時に、いくつかヒントを与えてくれます。以下のリストは、開始地点としていいですが、しかし決して完全ではありません。</p>
-<p>所有する参照を使うのは、</p>
-<ul> <li>オブジェクトを生成した時。</li> <li>オブジェクトを生成した可能性のある関数からオブジェクトを受け取った場合。 例えば、<code>QueryInterface</code> や <code>CreateInstance</code> のような、任意の「getter」関数。 望ましい getter はすべて、それらがつくり出したインタフェースポインタに対して <code>AddRef</code> を実行し、所有する参照を提供します。</li> <li>その参照を、あなたがそれを取得した関数のスコープよりも長く保持する場合。 例えば、パラメタとして受け取り、それをメンバ変数として保持する場合。 [例えば、以下の <a href="#Comparison_1">比較 1</a> を見てください]。</li>
-</ul>
-<p>所有する参照を使わなくてもよいのは、</p>
-<ul> <li>オブジェクトがパラメタとして渡され、かつその関数のスコープよりも長くそれを保持する必要がない場合。</li> <li>上手く定義されていることによって、当該オブジェクトの生存期間があなたのオブジェクトの生存期間を含んでいると分かっている場合。 例えば、ツリーのノードにおいて、 親のノードは、それらの子どもに対する所有する参照を保持しており、 子は、その親を所有する参照で保持する必要はありません。</li>
-</ul>
-<p>これらにより、参照カウントをプログラマが手動で正しくするのは、大変であることが分かります。それは、簡単そうに見えますが、しかし実際には <code>Release</code> を適切な時に実行するのは忘れやすいのです。あるいは、 <code>AddRef</code> を多く呼びすぎたり、呼び出しが足りなかったりすることもあります。</p>
-<h4 id="nsCOMPtr_.E3.81.AF.E3.80.81.E3.81.A9.E3.81.AE.E3.82.88.E3.81.86.E3.81.AB.E5.BD.B9.E3.81.AB.E7.AB.8B.E3.81.A4.E3.81.AE.E3.81.8B.3F" name="nsCOMPtr_.E3.81.AF.E3.80.81.E3.81.A9.E3.81.AE.E3.82.88.E3.81.86.E3.81.AB.E5.BD.B9.E3.81.AB.E7.AB.8B.E3.81.A4.E3.81.AE.E3.81.8B.3F"><code>nsCOMPtr</code> は、どのように役に立つのか?</h4>
-<p><code>nsCOMPtr</code> は、<code>AddRef</code>、<code>Release</code>、その他の煩わしい仕事をあなたのために管理します。<code>nsCOMPtr</code>は、見掛けも振舞いも C が許している生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタのようです。しかし、<code>nsCOMPtr</code> は、自分が指しているオブジェクトを所有していることを知っています。少し慣れる必要はありますが、しかし結果的に、タイピングが少なくて済み、きれいで、安全なコードを書くことができ、そしてリークが少なくなります。</p>
-<p>例えば、ここに典型的な (とてもコンパクトな) コードの断片があります。これは、<a href="/ja/XPCOM">XPCOM</a> インタフェースポインタをメンバ変数に代入しています。つまり、「setter」関数の本体です。生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタと <code>nsCOMPtr</code> を並べて使用しています。</p>
-<p> </p>
-<table> <caption>比較 1. メンバ変数を設定する </caption> <tbody> <tr> <td> <pre class="eval"><span class="comment">// 生の [XP]COM インタフェースポインタ...</span>
-<span class="comment">// 仮定: |nsIFoo* mFooPtr;|</span>
-
-<span class="comment"><span class="nowiki">/* もし |NULL| でなく新しい値なら、|AddRef| し それを代入します。もし古い値があれば、 |Release| します (そうやってリークを防ぎます)。   この割り当て順序は特別で、特定の所有者バグを防ぐために   使われなくてはなりません。 */</span></span>
-
-<strong>NS_IF_ADDREF(aFooPtr); nsIFoo* temp = mFooPtr;</strong>
-mFooPtr = aFooPtr;
-<strong>NS_IF_RELEASE(temp);</strong>
-</pre> </td> <td> <pre class="eval"><span class="comment">// |nsCOMPtr|...</span>
-<span class="comment">// 仮定: |nsCOMPtr&lt;nsIFoo&gt; mFooPtr;|</span>
-
-<span class="comment"><span class="nowiki">/* この代入は、|mFooPtr| に古い値が あれば自動的にそれを |Release| し、 新しい値に対して、先ほど触れた所有者バグを 防ぐために適切な順序で |AddRef| を 呼び出します。 */</span></span>
-
-
-
-
-
-mFooPtr = aFooPtr;
-
-</pre> </td> </tr> </tbody>
-</table>
-<p>付け加えると、生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタを使うクラスは、<code>mFooPtr</code> を <code>Release</code> するためのデストラクタを必要とします。そして、<code>mFooPtr</code> が <code>NULL</code> (または何らかの正当な値) で初期化されることを保証するコンストラクタを必要とします。</p>
-<p><code>nsCOMPtr</code>は、あなたが生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタを使うよりリークへの耐性があり、例外に対して安全で、だらだらとしないコードを書くのに役立ちます。<code>nsCOMPtr</code> を使う時は、<code>AddRef</code>、<code>QueryInterface</code> を手動で呼ぶ必要はないでしょう。</p>
-<p>それでもなお、 <a href="/ja/XPCOM">XPCOM</a> を理解する必要があります。また、どの関数が<code>AddRef</code>されたインタフェースポインタを返し、どの関数がそうでないものを返すのかを知っていなければなりません。また、あなたのプログラムロジックが循環参照によるゴミを作り出さないことを保障しなければなりません。<code>nsCOMPtr</code> は、万能薬ではありません。しかしながら、それは、役に立ち、簡単に使え、よくテストされ、そして洗練されています。関数の作者があなたと協調することを必要としません。またあなたがそれを使うことにより、他人にそれを使うよう強制することもありません。</p>
-<h3 id="nsCOMPtr_.E3.82.92.E4.BD.BF.E3.81.86" name="nsCOMPtr_.E3.82.92.E4.BD.BF.E3.81.86"><code>nsCOMPtr</code> を使う</h3>
-<h4 id=".E5.9F.BA.E6.9C.AC" name=".E5.9F.BA.E6.9C.AC">基本</h4>
-<p>ほとんどの場合、あなたは<code>nsCOMPtr</code>を生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタと全く同じように使うでしょう。宣言時のわずかな違いに注意してください。</p>
-<p> </p>
-<table> <caption>比較 2. 類似性: <code>nsCOMPtr</code>は、文法的に生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタに似ている。 </caption> <tbody> <tr> <td> <pre class="eval"><span class="comment">// 生の [XP]COM インタフェースポインタ...</span>
-
-nsIFoo<strong><span class="nowiki">*</span></strong> fooPtr <strong><span class="nowiki">= 0</span></strong><span class="nowiki">; </span><span class="comment">// ...</span>
-fooPtr-&gt;SomeFunction(x, y, z);
-AnotherFunction(fooPtr);
-
-if ( fooPtr )
- <span class="comment">// ...</span>
-
-if ( fooPtr == foo2Ptr )
- <span class="comment">// ...</span>
-</pre> </td> <td> <pre class="eval"><span class="comment">// |nsCOMPtr|...</span>
-
-<strong>nsCOMPtr&lt;</strong>nsIFoo<strong>&gt;</strong> fooPtr;
-<span class="comment">// ...</span>
-fooPtr-&gt;SomeFunction(x, y, z);
-AnotherFunction(fooPtr);
-
-if ( fooPtr )
- <span class="comment">// ...</span>
-
-if ( fooPtr == foo2Ptr )
- <span class="comment">// ...</span>
-</pre> </td> </tr> </tbody>
-</table>
-<p>二つの主な違いがあります。最初の違い: あなたはもはや <code>AddRef</code> や <code>Release</code> を呼ぶ必要がありません。また呼んでもいけません。</p>
-<p> </p>
-<table> <caption>Comparison 3. Differences: <code>AddRef</code> and <code>Release</code> are illegal for <code>nsCOMPtr</code>s. </caption> <tbody> <tr> <td> <pre class="eval"><span class="comment">// 生の [XP] COMインタフェースポインタ...</span>
-<span class="comment">// 仮定: |nsIFoo* mFooPtr;|</span>
-
- <span class="comment">/* 注意: この順序はどっちみち生のポインタが 代入された正しい順序ではありません (<a href="#Comparison_1">比較 1</a> を参照してください) しかし、 ここでは、この比較が必要です。 */</span>
-
-NS_IF_RELEASE(mFooPtr);
-
-mFooPtr = aFooPtr;
-NS_IF_ADDREF(mFooPtr);
-
-</pre> </td> <td> <pre class="eval"><span class="comment">// |nsCOMPtr|...</span>
-<span class="comment">// 仮定: |nsCOMPtr&lt;nsIFoo&gt; mFooPtr;|</span>
-
- <span class="comment">/* もはや |AddRef| や |Release| を呼ぶ 必要もありませんし、コンパイラはそれを エラーにします。 */</span>
-
-
-
-<span class="warning">NS_IF_RELEASE(mFooPtr);</span>
- <span class="comment">// エラー: |Release| はプライベートです。</span>
-mFooPtr = aFooPtr;
-<span class="warning">NS_IF_ADDREF(mFooPtr);</span>
- <span class="comment">// エラー: |AddRef| はプライベートです。</span>
-</pre> </td> </tr> </tbody>
-</table>
-<p>二番目の違い: あなたは、生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタのパラメタを通じて、結果を返すことを期待して、<code>nsCOMPtr</code> のアドレスを getter に渡すことができません。あなたは、<a href="/ja/Using_nsCOMPtr/Reference_Manual#.E3.80.8C.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF:_getter_AddRefs" title="ja/Using_nsCOMPtr/Reference_Manual#.E3.80.8C.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF:_getter_AddRefs"><code>getter_AddRefs</code></a> 指示子で、<code>nsCOMPtr</code> を注釈する必要があります。</p>
-<p> </p>
-<table> <caption>比較 4.違い: <code>nsCOMPtr</code>を`出力パラメタ'として使う時に、<code>getter_AddRefs</code>を適用する。 </caption> <tbody> <tr> <td> <pre class="eval"><span class="comment">// 生の [XP]COM インタフェースポインタ...</span>
-
-nsIFoo* foo;
-
-GetFoo(<strong>&amp;</strong>foo);
-</pre> </td> <td> <pre class="eval"><span class="comment">// |nsCOMPtr|s...</span>
-
-nsCOMPtr&lt;nsIFoo&gt; foo;
-
-GetFoo(<strong>getter_AddRefs(</strong>foo<strong>)</strong>);
-</pre> </td> </tr> </tbody>
-</table>
-<p>これで終りです。あなたは、もう<code>nsCOMPtr</code>を使い始めるのに十分な知識を持っています。この他に<code>nsCOMPtr</code>をもっと複雑な状況で使う時にあなたが知りたいであろう、いくつかの詳細な事柄があります。でもあなたが学んだことは、あなたが使う状況の 90% をカバーしています。</p>
-<h4 id=".E3.81.84.E3.81.8F.E3.81.A4.E3.81.8B.E3.81.AE.E8.A9.B3.E7.B4.B0" name=".E3.81.84.E3.81.8F.E3.81.A4.E3.81.8B.E3.81.AE.E8.A9.B3.E7.B4.B0">いくつかの詳細</h4>
-<p>あなたが <code>nsCOMPtr</code> から最大限のことを引き出すのを手伝ういくつかの事があります。</p>
-<p>しばしば、まず <code>QueryInterface</code> を呼ぶことで、あなたはインタフェースポインタを得ます。 <code>QueryInterface</code> は、他と同様に getter です。そして、上述したように <code>getter_AddRefs</code> ルールを適用して、それを呼び出す一つの方法をすでに知っています。</p>
-<table> <caption><code>nsCOMPtr</code> に <code>QueryInterface</code> する難しい方法 </caption> <tbody> <tr> <td> <pre class="eval"><span class="comment">// |nsCOMPtr| に |QuertyInterface| するやり方 (最良のやり方ではないですが)...</span>
-
-nsCOMPtr&lt;nsIFoo&gt; foo;
-
-nsresult rv = bar-&gt;QueryInterface(NS_GET_IID(nsIFoo), getter_AddRefs(foo));
-
- <span class="comment">// または、あなたが [XP]COM をよく知っているプログラマ</span>
- <span class="comment">// ならば、タイプセーフ版を使ってください...</span>
-nsresult rv = CallQueryInterface(bar, getter_AddRefs(foo));
-</pre> </td> </tr> </tbody>
-</table>
-<p><code>QueryInterface</code> はしばしば使われるので、<code>nsCOMPtr</code> には、それを呼び出すための特別に便利なものがあります。この便利なものは、タイプセーフで、これにより、<code>nsCOMPtr</code> が <code>QueryInterface</code> の結果から直接構築されます。正しい値からの構築は、構築後に代入するよりも効率的です。 この便利なものは、<a href="/ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29" title="ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29"><code>do_QueryInterface</code></a> 指示子です。<code>do_QueryInterface</code> を使うと、上記のサンプルはこのようになります。</p>
-<table> <caption><code>nsCOMPtr</code> への <code>QueryInterface</code> の仕方 </caption> <tbody> <tr> <td> <pre class="eval"><span class="comment">// |nsCOMPtr| へ |QueryInterface| するベストな方法...</span>
-
-nsresult rv;
-nsCOMPtr&lt;nsIFoo&gt; foo( <strong>do_QueryInterface(</strong>bar, &amp;rv<strong>)</strong> );
-
- <span class="comment">// または、もし |nsResult| について気にしないのであれば</span>
-nsCOMPtr&lt;nsIFoo&gt; foo( <strong>do_QueryInterface(</strong>bar<strong>)</strong> );
-</pre> </td> </tr> </tbody>
-</table>
-<p><code>nsCOMPtr</code> は、嬉しいことに <code>AddRef</code> と <code>Release</code> を暗黙的に呼び出します。同じような方法は、<code>QueryInterface</code> には、拡張され<em>ません</em>。<code>nsCOMPtr</code> は、代入において、<code>do_QueryInterface</code> 指示子を使った明示的な許可がなければ、<code>QueryInterface</code> を実行しません。あなたは、もう隠れた問い合わせについて心配する必要はありません。しかしながら、もしあなたが問い合わせをする<em>べき</em>なのに、しなかった場合に注意してください。例えば、生のポインタを代入する場合で、C が代入を許可しているが <a href="/ja/XPCOM">XPCOM</a> は許可していない場合。<code>nsCOMPtr</code> は、<a href="/ja/Using_nsCOMPtr/Reference_Manual#Type_Safeguards" title="ja/Using_nsCOMPtr/Reference_Manual#Type_Safeguards">実行時にアサートする</a> でしょう。異なった型の <a href="/ja/XPCOM">XPCOM</a> インタフェースに代入する時にはいつでも、<code>do_QueryInterface</code> を使ってください。たとえ、その型がたまたま <code>nsCOMPtr</code> の基底型から派生していてもです。</p>
-<p> </p>
-<table> <caption>比較 6. <code>do_QueryInterface</code> が <a href="/ja/XPCOM">XPCOM</a> の型のエラーを防ぐ。 </caption> <tbody> <tr> <td> <pre class="eval">
-class nsIBar
-  : public nsIFoo ... { ... };
-
-nsIBar* p = ...;
-
- <span class="comment">// C は、すべての |nsIBar*| が</span>
- <span class="comment">// |nsIFoo*| であるとみなします。そのため、C は</span>
- <span class="comment">// これを許可します...</span>
-nsCOMPtr&lt;nsIFoo&gt; <span class="warning">foo = p;</span>
- <span class="comment">// ...たとえそれが [XP]COM の型の</span>
- <span class="comment">// エラーだとしてもそうです。</span>
-</pre> </td> <td> <pre class="eval">
-class nsIBar
-  : public nsIFoo ... { ... };
-
-nsIBar* p = ...;
-
-
-
- <span class="comment">// ここでは、型のエラーはありません...</span>
-nsCOMPtr&lt;nsIFoo&gt; foo( <strong>do_QueryInterface(</strong>p<strong>)</strong> );
-
-
-</pre> </td> </tr> </tbody>
-</table>
-<p>覚えておいてください。C の型のシステムと <a href="/ja/XPCOM">XPCOM</a> の型のシステムは、互いに独立しているものです。<a href="/ja/XPCOM">XPCOM</a> インタフェースは、C の抽象基底クラスとして表現されているため、C に違いを処理させたり、あるいはインタフェースの型の間を取り持つために C のキャストを使ったりしたくなるかもしれません。これは、間違いです。<a href="/ja/XPCOM">XPCOM</a> の型の間で許されているのは、<code>QueryInterface</code> を使うことだけです。上記の例では、C が <code>p</code> から引き出す <code>nsIFoo*</code> が <code>p-&gt;QueryInterface()</code> が返すものと同一のものであると仮定する理由はありません。</p>
-<p><a href="/ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29" title="ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29"><code>dont_AddRef</code></a> は、同じような指示子で、例えば、その関数の結果としてポインタを返す getter を呼んだなどの理由で、すでに <code>AddRef</code> を実行したポインタを代入する時に役に立ちます。</p>
-<table> <caption><code>dont_AddRef</code> の使用 </caption> <tbody> <tr> <td> <pre class="eval">
-nsCOMPtr&lt;nsIFoo&gt; foo( <strong>dont_AddRef(</strong>CreateFoo()<strong>)</strong> );
- <span class="comment">// |CreateFoo| は、すべての望ましい getter が行うように、その結果を |AddRef| します。 </span></pre> </td> </tr> </tbody>
-</table>
-<h4 id="nsCOMPtr_.E3.81.8C.E3.81.97.E3.81.AA.E3.81.84.E3.81.93.E3.81.A8" name="nsCOMPtr_.E3.81.8C.E3.81.97.E3.81.AA.E3.81.84.E3.81.93.E3.81.A8"><code>nsCOMPtr</code> が<em>しない</em>こと</h4>
-<p><code>nsCOMPtr</code> は、所有する参照として振舞うために必要なすべてのことを行います。しかしながら、与えられた <code>nsCOMPtr</code> は、<em>他の</em>所有ポインタを作ることには協力しません。どうやって <code>nsCOMPtr</code> が<em>代入</em>される時に自動的にポインタを <code>AddRef</code> するかを学習した後、それが<em>参照</em>される時にも同じことをすると仮定するのは、自然です。この誤解を示すコード断片を載せます。</p>
-<table> <tbody> <tr> <td> <pre class="eval"><span class="comment">// |nsCOMPtr| に関する間違った仮定...</span>
-
-nsresult
-nsCacheRecord::GetFileSpec( nsIFileSpec** aFileSpecResult )
- <span class="comment">/* ...呼び出し側の |nsFileSpec*| (呼び出し側がアドレスを設定します) に 私のメンバ変数の |mFileSpec| (|nsCOMPtr型|) のコピーが代入されます。 つまり、この関数は「getter」です。 覚えてください: 望ましい [XP]COM getter は、いつも結果に対して |AddRef| を実行します。 */</span>
- {
- <span class="comment">// ...</span>
- *aFileSpec = mFileSpec;
- <span class="warning"><span class="comment">// |nsCOMPtr| は、参照カウントに気をつけるべきです。いいですか?</span></span>
- return NS_OK;
- }
-</pre> </td> </tr> </tbody>
-</table>
-<p>明らかに、作者は (いくつかの疑問を持ちながらかもしれませんが)、<code>nsCOMPtr</code> つまり <code>mFileSpec</code> は、<code>*aFileSpec</code> への代入される時、自動的に <code>AddRef</code> を呼ぶと信じています。この場合は<em>違います</em>。<code>nsCOMPtr</code> は、<em>自分の</em>ため (だけ) に、自動的に <code>AddRef</code> と <code>Release</code> を呼び出します。その他のすべての状況において、それは、生の <a href="/ja/XPCOM">XPCOM</a> ポインタを置き換えるスロットとして設計されています。<code>nsCOMPtr</code> が生のポインタが必要とされているところで使われていたら、<code>nsCOMPtr</code> は自動的にそれを提供します。</p>
-<table> <tbody> <tr> <td> <pre class="eval"><span class="comment">// |nsCOMPtr| は、生のポインタが必要とされている場合は、それを提供します...</span>
-
-nsCOMPtr&lt;nsIFoo&gt; foo = ...;
-
- <span class="comment">// 1. 生のポインタに代入</span>
-nsIFoo* raw_foo = foo;
-
- <span class="comment">// 2. 別の |nsCOMPtr| に代入</span>
-nsCOMPtr&lt;nsIFoo&gt; foo2 = foo;
-
- <span class="comment">// 3. パラメタとして</span>
-SetFoo(foo);
-
- <span class="comment">// 4. |if| 式の中で値をテスト</span>
- <span class="comment">// 5. メンバ関数の呼び出し</span>
-if ( foo )
- foo-&gt;DoSomething();
-</pre> </td> </tr> </tbody>
-</table>
-<p>これらすべての場合において、かなり正確に同じコードが実行されます (2 番目のケースは、少し違いますが、意図は同じです)。それぞれの場合において、あなたは本質的に自分の目的のために生のポインタの値を取り出しています。もし <code>nsCOMPtr</code> が値に対して、その都度 <code>AddRef</code> を実行すると、4 番目のケースと 5 番目のケースではあきらかにいつもリークを作り出してしまいます。ケース 3 の <code>SetFoo</code> は、場合によって、二つの異なった書き方で書かれる必要があります。それは、<code>nsCOMPtr</code> が与えられた場合は、値に対してすでに <code>AddRef</code> が実行されていることが分かり、そして生のポインタが与えられた場合、値に対して <code>AddRef</code> は実行されていないことがわかるためです。実際、矛盾はこれらよりもっと深くまで広がります。これらすべてのケースは、「出力」に対して自動的に <code>AddRef</code> を実行すると、<code>nsCOMPtr</code> と生のポインタがクライアントの視点から見て異なる振舞いをすることになるということを示しています。同じように振舞うようにさせるのが目的であり、そのため <code>nsCOMPtr</code> は、置き換えのスロットになりうるのです(自分の「所有権」について管理することを守らせることにより)。</p>
-<p>あなたが今知ったことから、ルールは明らかです。上述したように、そうしないように指示しない限り、<code>nsCOMPtr</code> は、<em>代入</em>される時に <code>AddRef</code> を実行します。<code>nsCOMPtr</code> は、<em>参照</em>される時は何もしません。</p>
-<h4 id=".E3.81.A9.E3.81.93.E3.81.A7nsCOMPtr.E3.82.92.E4.BD.BF.E3.81.86.E3.81.B9.E3.81.8D.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.EF.BC.9F" name=".E3.81.A9.E3.81.93.E3.81.A7nsCOMPtr.E3.82.92.E4.BD.BF.E3.81.86.E3.81.B9.E3.81.8D.E3.81.A7.E3.81.97.E3.82.87.E3.81.86.E3.81.8B.EF.BC.9F">どこで<code>nsCOMPtr</code>を使うべきでしょうか?</h4>
-<p>インタフェースポインタを所有する参照として使うところでは、どこでも <code>nsCOMPtr</code> を使うべきです。つまり、あなたがそれに対して <code>AddRef</code> と <code>Release</code> を呼び出す所です。setter を単純にする場合、そしてコンストラクタ、デストラクタ、代入演算子を除去する場合、<code>nsCOMPtr</code> をメンバ変数として使うべきです。<code>QueryInterface</code> の呼び出しをおおむね快適にし、エラー処理を避けるための複雑なロジックを除去する場合、<code>nsCOMPtr</code> をスタック上で使うべきです。</p>
-<h4 id=".E3.81.A9.E3.81.93.E3.81.A7nsCOMPtr.E3.82.92.E4.BD.BF.E3.81.86.E3.81.B9.E3.81.8D.E3.81.A7.E3.81.AF.E3.81.AA.E3.81.84.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F" name=".E3.81.A9.E3.81.93.E3.81.A7nsCOMPtr.E3.82.92.E4.BD.BF.E3.81.86.E3.81.B9.E3.81.8D.E3.81.A7.E3.81.AF.E3.81.AA.E3.81.84.E3.81.A7.E3.81.99.E3.81.8B.EF.BC.9F">どこで<code>nsCOMPtr</code>を使うべきではないですか?</h4>
-<p>所有する参照を必要としないところでは、<code>nsCOMPtr</code>を使わないでください。<a href="/ja/XPCOM_ownership_guidelines" title="ja/XPCOM_ownership_guidelines">COM の所有のガイドライン</a> を見てください。<code>nsCOMPtr</code> は <a href="/ja/XPCOM">XPCOM</a> インタフェースとともに使われるように設計されています。そのため、<a href="/ja/Using_nsCOMPtr/Getting_Started_Guide#.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.81.A7.E3.81.AA.E3.81.84.E3.82.AF.E3.83.A9.E3.82.B9.E3.81.AE.E3.81.9F.E3.82.81.E3.81.AE_nsCOMPtr" title="ja/Using_nsCOMPtr/Getting_Started_Guide#.E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.81.A7.E3.81.AA.E3.81.84.E3.82.AF.E3.83.A9.E3.82.B9.E3.81.AE.E3.81.9F.E3.82.81.E3.81.AE_nsCOMPtr">以下</a> に示すように特定の例外を伴うインタフェースでないものと一緒には使わないでください。<a href="/ja/XPCOM">XPCOM</a> の中で <code>nsCOMPtr</code> を使わないでください。それらをプレーンな古い C コード上で使わないでください。もちろん、<code>nsCOMPtr</code>は C だけの構築物です。<code>nsCOMPtr</code> を決して <a href="/ja/Using_nsCOMPtr/Reference_Manual#.E3.82.AD.E3.83.A3.E3.82.B9.E3.83.88" title="ja/Using_nsCOMPtr/Reference_Manual#.E3.82.AD.E3.83.A3.E3.82.B9.E3.83.88">キャストしないで</a> ください。それをすると、ほとんどリークが保証されたようなものです。</p>
-<h4 id=".E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.81.A7.E3.81.AA.E3.81.84.E3.82.AF.E3.83.A9.E3.82.B9.E3.81.AE.E3.81.9F.E3.82.81.E3.81.AE_nsCOMPtr" name=".E3.82.A4.E3.83.B3.E3.82.BF.E3.83.95.E3.82.A7.E3.83.BC.E3.82.B9.E3.81.A7.E3.81.AA.E3.81.84.E3.82.AF.E3.83.A9.E3.82.B9.E3.81.AE.E3.81.9F.E3.82.81.E3.81.AE_nsCOMPtr">インタフェースでないクラスのための <code>nsCOMPtr</code></h4>
-<p>適切にフォーマットした解答を追加する予定です。当面の間、詳細全体は <a class="link-news" href="news://news.mozilla.org/scc-3E1526.12182423042001@h-204-29-187-152.netscape.com">この news 投稿</a> で利用可能です。</p>
-<h4 id=".E9.96.A2.E6.95.B0.E8.AD.98.E5.88.A5.E5.AD.90.E5.86.85.E3.81.AE_nsCOMPtr" name=".E9.96.A2.E6.95.B0.E8.AD.98.E5.88.A5.E5.AD.90.E5.86.85.E3.81.AE_nsCOMPtr">関数識別子内の <code>nsCOMPtr</code></h4>
-<p>一般的に、XPCOM (つまり、「スクリプタブル」) 関数の識別子内で、<code>nsCOMPtr</code> を使いたいとは思わないでしょう。<code>nsCOMPtr</code> は現在 IDL により直接サポートはされていません。しかし、あなたは時々スクリプタブルでない関数内で <code>nsCOMPtr</code> を使いたくなるかもしれません。</p>
-<h5 id="nsCOMPtr.3CT.3E_f.28.29_nsCOMPtr_.E3.82.92.E3.83.AA.E3.82.BF.E3.83.BC.E3.83.B3.E5.80.A4.E3.81.A8.E3.81.97.E3.81.A6.E8.BF.94.E3.81.95.E3.81.AA.E3.81.84" name="nsCOMPtr.3CT.3E_f.28.29_nsCOMPtr_.E3.82.92.E3.83.AA.E3.82.BF.E3.83.BC.E3.83.B3.E5.80.A4.E3.81.A8.E3.81.97.E3.81.A6.E8.BF.94.E3.81.95.E3.81.AA.E3.81.84"><code>nsCOMPtr&lt;T&gt; f()</code> <code>nsCOMPtr</code> をリターン値として返さない</h5>
-<p>この方法は危険です。<code>AddRef</code> されたポインタを関数のリターン値として返すことは、ほとんどどの様な形で行なっても、リークや無効なポインタなどの、かなりひどい潜在的エラーに行きつきます。 <code>nsCOMPtr</code> をリターンすることは (クライアントがそれに所有権を与えたことをクライアントに教えるので) よい考えのように見えますが、これは無効なポインタを引き起こします。以下のコードを考えてみてください。</p>
-<table> <tbody> <tr> <td> <pre class="eval"><span class="comment">// |nsCOMPtr|を返してはいけません...</span>
-nsCOMPtr&lt;nsIFoo&gt; CreateFoo();
-<span class="comment">// ...</span>
-
-<span class="warning">nsIFoo* myFoo = CreateFoo();</span> <span class="comment">// おっと: |myFoo| はもう無効!</span>
- <span class="comment">// |CreateFoo| は |nsCOMPtr| を返すけれど、</span>
- <span class="comment">// |nsCOMPtr| はこの代入のあと正しく自動的に |Release| する</span>
- <span class="comment">// 今 |myFoo| は削除されたオブジェクト</span>
- <span class="comment">// を参照している。</span>
-</pre> </td> </tr> </tbody>
-</table>
-<p><code>already_AddRefed&lt;T&gt;</code> をリターンすることにより、呼び出し側に、この危険なしにそれらに所有権を与えたことを通知できます (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=59212" title="FIXED: leaks with nsCOMPtr&lt;nsIAtom> foo = NS_NewAtom(...)">バグ 59212</a>参照)。<code>nsCOMPtr</code> は、<code>already_AddRefed</code> された値は、<code>AddRef</code> すべきではない事を知るようになります。</p>
-<table> <tbody> <tr> <td> <pre class="eval"><span class="comment">// 好ましい方法: もし、ポインタを返す必要があるなら、|already_AddRefed| を使うこと...</span>
-already_AddRefed&lt;nsIFoo&gt; CreateFoo();
-<span class="comment">// ...</span>
-
-nsIFoo* myFoo1 = CreateFoo(); <span class="comment">// 無効にならない</span>
-nsCOMPtr&lt;nsIFoo&gt; myFoo2( CreateFoo() ); <span class="comment">// リークしない</span>
-nsCOMPtr&lt;nsIFoo&gt; myFoo3( dont_AddRef(CreateFoo()) ); <span class="comment">// 冗長だが認められており正しい</span>
-</pre> </td> </tr> </tbody>
-</table>
-<p>これを、既に <code>AddRef</code> した生ポインタをリターンすることを原因とする、最も頻繁に起こりうるリークと比べてみてください。</p>
-<table> <tbody> <tr> <td> <pre class="eval"><span class="comment">// 生のポインタを返さないでください、リークを誘発します...</span>
-nsIFoo* CreateFoo(); <span class="comment">// |AddRef| されたポインタを返してください</span>
-<span class="comment">// ...</span>
-
-<span class="warning">nsCOMPtr&lt;nsIFoo&gt; myFoo = CreateFoo();</span> <span class="comment">// おっと: リークだ</span>
-nsCOMPtr&lt;nsIFoo&gt; myFoo( <span class="notice">dont_AddRef(</span>CreateFoo()<span class="notice">)</span> );
- <span class="comment">// |CreateFoo| その結果を既に |AddRef| しているため、私たちは |nsCOMPtr|</span>
- <span class="comment">// をそうしないように覚えておかなくてはなりません。それは忘れやすいことです。</span>
- <span class="comment">// 関数の戻り値としてポインタを返さないか、さもなければ上記のように</span>
- <span class="comment">// |already_AddRefed&lt;T&gt;| を返すかしてあらかじめ防いでください。</span>
-</pre> </td> </tr> </tbody>
-</table>
-<p> </p>
-<h5 id="void_f.28_nsCOMPtr.3CT.3E_.29_nsCOMPtr.E3.82.92.E5.80.A4.E6.B8.A1.E3.81.97.E3.81.97.E3.81.AA.E3.81.84" name="void_f.28_nsCOMPtr.3CT.3E_.29_nsCOMPtr.E3.82.92.E5.80.A4.E6.B8.A1.E3.81.97.E3.81.97.E3.81.AA.E3.81.84"><code>void f( nsCOMPtr&lt;T&gt; )</code> <code>nsCOMPtr</code>を値渡ししない</h5>
-<p>この方法は役に立たないどころか、実害があります。引き数は関数コールと同じ生存期間を保証されるので、引き数を <code>AddRef</code> する必要はありません。関数コールを超えて生き残る構造体のメンバに値を格納する時のみ、<code>AddRef</code> が必要になります。これは、関数の引き数ではなく、構造体の適切なメンバが <code>nsCOMPtr</code> であるべきことを意味します。更にこの書き方は、呼び出し側に、単に関数をコールするために <code>nsCOMPtr</code> が必要なのではないかと思わせ、混乱させます。</p>
-<h5 id="void_f.28_const_nsCOMPtr.3CT.3E_.29_nsCOMPtr_.E3.82.92const_.E5.8F.82.E7.85.A7.E6.B8.A1.E3.81.97.E3.81.97.E3.81.AA.E3.81.84" name="void_f.28_const_nsCOMPtr.3CT.3E&amp;_.29_nsCOMPtr_.E3.82.92const_.E5.8F.82.E7.85.A7.E6.B8.A1.E3.81.97.E3.81.97.E3.81.AA.E3.81.84"><code>void f( const nsCOMPtr&lt;T&gt;&amp; )</code> <code>nsCOMPtr</code> を<code>const</code> 参照渡ししない</h5>
-<p>上の書き方と全く同じで、この方法は役に立たないどころか、実害があります。もし呼び出し側が生ポインタを渡した場合には、<code>nsCOMPtr</code> を値渡しするのと同じ良く無いことが起こります。</p>
-<h5 id="void_f.28_nsCOMPtr.3CT.3E.2A_.29_.E3.81.A7.E3.81.8D.E3.82.8C.E3.81.B0_nsCOMPtr_.E3.81.AE.E3.82.A2.E3.83.89.E3.83.AC.E3.82.B9.E6.B8.A1.E3.81.97.E3.81.AF.E9.81.BF.E3.81.91.E3.82.8B" name="void_f.28_nsCOMPtr.3CT.3E.2A_.29_.E3.81.A7.E3.81.8D.E3.82.8C.E3.81.B0_nsCOMPtr_.E3.81.AE.E3.82.A2.E3.83.89.E3.83.AC.E3.82.B9.E6.B8.A1.E3.81.97.E3.81.AF.E9.81.BF.E3.81.91.E3.82.8B"><code>void f( nsCOMPtr&lt;T&gt;* )</code> できれば <code>nsCOMPtr</code> のアドレス渡しは避ける</h5>
-<p>この方法は、呼び出し側に、それが <code>nsCOMPtr</code> を使用することと、ちょっとした余分な仕事を要求します。と言うのは、<code>nsCOMPtr</code> の <code>operator&amp;</code> は (<a href="/ja/Using_nsCOMPtr/Reference_Manual#.E3.82.AD.E3.83.A3.E3.82.B9.E3.83.88" title="ja/Using_nsCOMPtr/Reference_Manual#.E3.82.AD.E3.83.A3.E3.82.B9.E3.83.88">キャストによるリーク</a> を防ぐために: <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=59414" title="FIXED: misuse of nsCOMPtr::operator&amp;">バグ 59414</a> 参照) <code>private</code> だからです。この方法は、「入出力」引き数として宣言する事により、以下のように可能ですが、<code>nsCOMPtr</code> を参照渡しする方が好ましいでしょう。</p>
-<table> <tbody> <tr> <td> <pre class="eval"><span class="comment">// |nsCOMPtr| のポインタ渡しは余計な仕事を増やすk...</span>
-void f( nsCOMPtr&lt;nsIFoo&gt;* );
-<span class="comment">// ...</span>
-
-nsCOMPtr&lt;nsIFoo&gt; myFoo = ...;
-
-f( <span class="notice">address_of(</span>myFoo<span class="notice">)</span> );
-</pre> </td> </tr> </tbody>
-</table>
-<h5 id="void_f.28_nsCOMPtr.3CT.3E_.29_.E3.81.A1.E3.82.83.E3.82.93.E3.81.A8nsCOMPtr.E3.82.92.E3.80.8C.E5.85.A5.E5.87.BA.E5.8A.9B.E3.80.8D.E5.BC.95.E3.81.8D.E6.95.B0.E3.81.A8.E3.81.97.E3.81.A6.E5.8F.82.E7.85.A7.E6.B8.A1.E3.81.97.E3.81.99.E3.82.8B" name="void_f.28_nsCOMPtr.3CT.3E&amp;_.29_.E3.81.A1.E3.82.83.E3.82.93.E3.81.A8nsCOMPtr.E3.82.92.E3.80.8C.E5.85.A5.E5.87.BA.E5.8A.9B.E3.80.8D.E5.BC.95.E3.81.8D.E6.95.B0.E3.81.A8.E3.81.97.E3.81.A6.E5.8F.82.E7.85.A7.E6.B8.A1.E3.81.97.E3.81.99.E3.82.8B"><code>void f( nsCOMPtr&lt;T&gt;&amp; )</code> ちゃんと<code>nsCOMPtr</code>を「入出力」引き数として参照渡しする</h5>
-<p>これは「入出力」引き数を提供するために好ましい方法です。もし代りに生ポインタを使った場合、関数内部では、入力値として呼び出し側がどの所有する関係を持っているかが、分らなくなります。結果として、新しい値を代入する前に <code>Release</code> すべきかどうかが分らなくなります。引き数を <code>nsCOMPtr&amp;</code>、として宣言する事により、関係が明確になります。</p>
-<h3 id=".E8.A6.81.E7.B4.84" name=".E8.A6.81.E7.B4.84">要約</h3>
-<p><code>nsCOMPtr</code> は、所有する参照です。それが指すものはなんであれ <code>AddRef</code> され、<code>nsCOMPtr</code> をその「所有者」の一つとしてカウントします。<code>nsCOMPtr</code> は、<code>nsCOMPtr</code> が違うオブジェクトを指すために解放されるか、<code>nsCOMPtr</code> がスコープを抜けようとしているためかいずれにしろ、解放される前に必ず <code>Release</code> を呼び出します。新しい値が <code>nsCOMPtr</code> に割り当てられる時は、<code>nsCOMPtr</code> は、いつも自動的に、もし古い参照があれば、それを <code>Release</code> し、(そしてあなたがすでに実行済であると明示しなければ) 新しい方を <code>AddRef</code> します。</p>
-<p>あなたは<code>nsCOMPtr</code>を厳密にほとんどすべての場合で生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタとして使うことができます [<a href="#Comparison_5">|比較 5</a> で示すようなコンパイラの問題にも、注意しなければいけないですが]。あなたは、それを通じて明示的に <code>AddRef</code> や <code>Release</code> を呼ばなくてよいです。また、コンパイラもそれを許しません。あなたが <code>nsCOMPtr</code> を変更しなければ使うところのできない唯一の場所は、生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタが`出力'引数である場所です。この場合、あなたは <code>nsCOMPtr</code> を <a href="/ja/Using_nsCOMPtr/Reference_Manual#.60Out.27_Parameters:_getter_AddRefs" title="ja/Using_nsCOMPtr/Reference_Manual#.60Out.27_Parameters:_getter_AddRefs"><code>getter_AddRefs</code></a> でラップします [<a href="#Comparison 4">比較 4</a>を見てください]。</p>
-<p><code>nsCOMPtr</code> に代入した時に、(生の <a href="/ja/XPCOM">XPCOM</a> インタフェースポインタであっても <code>nsCOMPtr</code> であっても、) 通常は、追加の指示子なしに単にもう一つのポインタを渡すだけです [例えば、<a href="#Comparison_1">比較 1</a> の <code>nsCOMPtr</code> の方を見てください]。上述したように、指示子なしに、<code>nsCOMPtr</code> は、もし古い対象があれば、それに対して、<code>Release</code> を呼び出し、そして新しい方に対して、<code>AddRef</code> を呼び出します。このようにするのが適切なのは、新しい参照に対して責任をとるために、あなたが代入したものに対してまだ <code>AddRef</code> を実行していない時です。これは、あなたが取得する関数を呼び出したのでは<em>ない</em>ポインタを代入する時によくある場合です。例えば、引き数として渡されたものや、構造体から抜きだしたものなどです。</p>
-<p>あなたは、<code>nsCOMPtr</code> に、新しい値を <a href="/ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29" title="ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29"><code>dont_AddRef</code></a> でラップすることにより、代入において新しい値を <code>AddRef</code> する必要がないことを伝えることができます。例えば、すべての望ましい <a href="/ja/XPCOM">XPCOM</a> getter のように、あなたのためにすでに <code>AddRef</code> を呼び出している関数から新しい値を得た場合に、これを行ってください。</p>
-<p>あなたは、ポインタを異なったインタフェース型に代入してはいけません。あなたは、まず正しい型に問い合わせる必要があります [例えば、<a href="#Comparison_6">比較 6</a> と周辺の議論を見てください]。<code>nsCOMPtr</code> は、決して <code>QueryInterface</code> を暗黙的に呼び出し<em>ません</em>。つまり、あなたは自分でそれを呼ばなければいけません。あるいは、明示的に <a href="/ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29" title="ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29"><code>do_QueryInterface</code></a> を使って、<code>nsCOMPtr</code> にそれを呼ぶように依頼しなければいけません。<code>do_QueryInterface</code> 指示子は、あなたが代入の一部として問い合わせをするのを許します。このよりよい便利な機構により、構築してから正しい値を後で代入するのではなく、(代入での) 右の値から <code>nsCOMPtr</code> を直接構築されます。構築に続いて代入するより、構築だけで済ませる方が効率的です。合理的である限り、代入と同時に構築する方を選んでください。<code>AddRef</code> したポインタを返す関数に対して、<code>do_QueryInterface</code> を適用しないように注意してください。[説明のために <a href="/ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_.2F.2A_call_QueryInterface_but_don.27t_AddRef_.2A.2F" title="ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_.2F.2A_call_QueryInterface_but_don.27t_AddRef_.2A.2F">この短いセクション</a> を見てください。]</p>
-<p>より詳しいことについては、<a href="/ja/Using_nsCOMPtr/Reference_Manual" title="ja/Using_nsCOMPtr/Reference_Manual">リファレンスマニュアル</a> に続きます。</p>
-
-<p> </p>
diff --git a/files/ja/mozilla/tech/xpcom/using_nscomptr/index.html b/files/ja/mozilla/tech/xpcom/using_nscomptr/index.html
deleted file mode 100644
index 5d821dfeca..0000000000
--- a/files/ja/mozilla/tech/xpcom/using_nscomptr/index.html
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Using nsCOMPtr
-slug: Mozilla/Tech/XPCOM/Using_nsCOMPtr
-tags:
- - XPCOM
-translation_of: Mozilla/Tech/XPCOM/Using_nsCOMPtr
----
-<p>このドキュメントは、<code>nsCOMPtr</code> について書かれたすべてを集めたものです。もしあなたが <code>nsCOMPtr</code> について疑問があり、このドキュメントでは分からないのであれば、 おそらくそれに答えられるドキュメントはないでしょう。<a class="external" href="news:mozilla.dev.tech.xpcom">XPCOM ニュースグループ</a>、または他のベテランの <code>nsCOMPtr</code> ユーザに尋ねる、あるいは実験して答えを見つける、などの別の手段で答えを得るしかありません。 </p><p>もしあなたがまだ <code>nsCOMPtr</code> 使ったことがないのであれば、ここは始めるのに適した場所です。そのまま読み進んでください。いつ止めるかは、あなた次第です。<code>nsCOMPtr</code> をしばらく使った後で、未知の領域に到達したり、コンパイルエラーになったりしたら、このドキュメントに戻ってきて、<a href="ja/Using_nsCOMPtr/Reference_Manual">リファレンスマニュアル</a>、あるいは <a href="ja/Using_nsCOMPtr/Frequently_Asked_Questions">FAQ</a> から助けを得たいと思うでしょう。
-</p>
-<h2 id="目次"> 目次 </h2>
-<ol><li> <a href="ja/Using_nsCOMPtr/Status%2c_Recent_Changes%2c_and_Plans">状況、最近の更新と計画</a>
-</li><li> <a href="ja/Using_nsCOMPtr/Getting_Started_Guide">スタートガイド</a>
-</li><li> <a href="ja/Using_nsCOMPtr/Reference_Manual">リファレンスマニュアル</a>
-</li><li> <a href="ja/Using_nsCOMPtr/Frequently_Asked_Questions">よく聞かれる質問</a>
-</li></ol>
-<div class="originaldocinfo">
-<h2 id="原文書の情報"> 原文書の情報 </h2>
-<ul><li> 著者: <a class="link-mailto" href="mailto:scc@mozilla.org">Scott Collins</a>
-</li><li> 最終更新日: December 11, 2001
-</li><li> 著作権: Copyright © 1999, 2000 by the Mozilla organization; use is subject to the <a class="external" href="http://www.mozilla.org/MPL/">MPL</a>. Portions of this content are © 1998–2007 by individual mozilla.org contributors; content available under a Creative Commons license | <a class="external" href="http://www.mozilla.org/foundation/licensing/website-content.html">詳細</a>
-</li></ul>
-</div>
-<div class="noinclude">
-</div>
diff --git a/files/ja/mozilla/tech/xpcom/using_nscomptr/reference_manual/index.html b/files/ja/mozilla/tech/xpcom/using_nscomptr/reference_manual/index.html
deleted file mode 100644
index c5c82f9fdd..0000000000
--- a/files/ja/mozilla/tech/xpcom/using_nscomptr/reference_manual/index.html
+++ /dev/null
@@ -1,523 +0,0 @@
----
-title: Reference Manual
-slug: Mozilla/Tech/XPCOM/Using_nsCOMPtr/Reference_Manual
-tags:
- - XPCOM
-translation_of: Mozilla/Tech/XPCOM/Using_nsCOMPtr/Reference_Manual
----
-<p>
-</p><p>このセクションは、あなたが、すでに <code>nsCOMPtr</code> に慣れ親しんでいるけれども、もっと詳細な事柄を知りたい場合に役立つでしょう。もし、まだ <code>nsCOMPtr</code> を前に使っていないのであれば、まず <a href="ja/Using_nsCOMPtr/Getting_Started_Guide">スタートガイド</a> を読みたいかもしれません。もし、壊れたビルドを直そうとしているのであれば、<a href="ja/Using_nsCOMPtr/Frequently_Asked_Questions">FAQ</a> によって、もっと素早く答えを得られるかもしれません。
-</p>
-<h3 id=".E5.9F.BA.E6.9C.AC" name=".E5.9F.BA.E6.9C.AC"> 基本 </h3>
-<h4 id=".E8.A8.AD.E8.A8.88" name=".E8.A8.AD.E8.A8.88"> 設計 </h4>
-<p><code>nsCOMPtr</code> は、所有する参照として使われる所で、生の [XP]COM インタフェースポインタを完全に置き換えるように設計されました。生の [XP]COM インタフェースポインタを使うことができるところであれば、ほとんどの場合、<code>nsCOMPtr</code> を使うことができるはずです。<code>nsCOMPtr</code>は、生の [XP]COM インタフェースポインタと正確な同じ大きさと形です。それは、容量を食いすぎることもなく、メンバ変数として使うことができます。
-</p><p>所有する参照のほとんどの作業は、<code>nsCOMPtr</code> のコンストラクタ、デストラクタと代入演算子で行われます。あなたが(代入や初期化により) <code>nsCOMPtr</code> を異なる [XP]COM オブジェクトで「指す」場合、もし古い値があれば、それを <code>Release</code> しなければなりません。そして、新しい値を <code>AddRef</code> しなければなりません。自分のデストラクタ実行時には、同様に <code>Release</code> しなければなりません。<code>nsCOMPtr</code> は、もしあなたがいつも正しいことを覚えているのであれば、ちょうどあなたがしていた作業しかしません。
-</p>
-<h4 id=".E5.AE.89.E5.85.A8.E6.80.A7.E3.81.AE.E7.89.B9.E5.BE.B4" name=".E5.AE.89.E5.85.A8.E6.80.A7.E3.81.AE.E7.89.B9.E5.BE.B4"> 安全性の特徴 </h4>
-<h5 id=".E5.9E.8B.E3.81.AE.E4.BF.9D.E8.AD.B7.E6.89.8B.E6.AE.B5" name=".E5.9E.8B.E3.81.AE.E4.BF.9D.E8.AD.B7.E6.89.8B.E6.AE.B5"> 型の保護手段 </h5>
-<p>元の型のための正しい [XP]COM インタフェースポインタを保持しているのは、<code>nsCOMPtr</code> の不変性です。例えば、<code>nsCOMPtr&lt;nsIFoo&gt;</code> は、[XP]COM オブジェクトに <code>nsIFoo</code> インタフェースを問い合わせる時に、code&gt;QueryInterface&lt;/code&gt; によって返されるポインタを常に保持しています。デバッグビルドでは、もし代入時に <code>QueryInterface</code> を呼ばずに、この不変性を覆すと、<code>nsCOMPtr</code> は、間違った代入として実行時にアサートするでしょう。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 二つの無関係なインタフェース |nsIFoo| と |nsIBar| があるものとします...</span>
-nsIBar* bar = ...;
-<span class="comment">// ...</span>
-
-<span class="warning">nsCOMPtr&lt;nsIFoo&gt; foo = bar;</span>
- <span class="comment">// NS_ASSERTION: "QueryInterface needed"</span>
-
- <span class="comment">// ...あなたは、この行をコンパイルできるとみなすかもしれませんが</span>
- <span class="comment">// (キャストでもそうです。なぜなら型が C に関係づけられているからです)</span>
-</pre>
-</td></tr></tbody></table>
-<p>この不変性は、<code>nsCOMPtr&lt;nsISupports&gt;</code> では、緩められます。<code>nsISupports*</code>(あるいは<code>void*</code>)のように、人々は一般的に<code>nsCOMPtr&lt;nsISupports&gt;</code> を「任意の [XP]COM インタフェース」とみなして使います。もし実際の型を気にしないようなオブジェクトに対して、<code>nsCOMPtr</code> が [XP]COM として正しい <code>nsISupports</code> に <code>QueryInterface</code> することを強制するのであれば、煩わしいかもしれません。
-</p>
-<h5 id="NULL_.E9.96.93.E6.8E.A5.E5.8F.82.E7.85.A7.E3.81.AE.E4.BF.9D.E8.AD.B7.E6.89.8B.E6.AE.B5" name="NULL_.E9.96.93.E6.8E.A5.E5.8F.82.E7.85.A7.E3.81.AE.E4.BF.9D.E8.AD.B7.E6.89.8B.E6.AE.B5"> <code>NULL</code> 間接参照の保護手段 </h5>
-<p>もし中が空の時に間接参照しようとすると、<code>nsCOMPtr</code> は、実行時にアサートします。例えば、
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval">nsCOMPtr&lt;nsIFoo&gt; foo;
- <span class="comment">// 注: デフォルトでは、|0| に初期化されます。</span>
-
-<span class="warning">foo-&gt;DoSomething();</span>
- <span class="comment">// NS_PRECONDITION: "You can't dereference a NULL nsCOMPtr with operator-&gt;()"</span>
-</pre>
-</td></tr></tbody></table>
-<p>同様の事前条件が <code>operator*</code> のために、介在します。
-</p>
-<h5 id=".E5.8F.82.E7.85.A7.E3.82.AB.E3.82.A6.E3.83.B3.E3.83.88.E3.81.AE.E4.BF.9D.E8.AD.B7.E6.89.8B.E6.AE.B5" name=".E5.8F.82.E7.85.A7.E3.82.AB.E3.82.A6.E3.83.B3.E3.83.88.E3.81.AE.E4.BF.9D.E8.AD.B7.E6.89.8B.E6.AE.B5"> 参照カウントの保護手段 </h5>
-<p><code>nsCOMPtr</code> から元の生のポインタを取り出すすべての操作に対して、安全な特徴を実装するための C の別のトリックを使います。返ってきたポインタに対して、<code>AddRef</code>、<code>Release</code>、<code>delete</code>を実行することができません。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval">nsCOMPtr&lt;nsIFoo&gt; foo = ...;
-
-<span class="warning">foo-&gt;AddRef();</span> <span class="comment">// エラー: |AddRef| はプライベートです。</span>
-<span class="warning">delete foo.get();</span> <span class="comment">// エラー: |operator delete| はプライベートです。</span>
-<span class="warning">NS_RELEASE(foo);</span> <span class="comment">// エラー: |Release| はプライベートです。</span>
-</pre>
-</td></tr></tbody></table>
-<p>もちろん、<code>nsCOMPtr</code> によって提供される安全性に関する最も重要な特徴は、それが適切な時期に自動的に <code>AddRef</code> と <code>Release</code> を実行することです。
-</p>
-<h4 id=".E3.82.AD.E3.83.A3.E3.82.B9.E3.83.88" name=".E3.82.AD.E3.83.A3.E3.82.B9.E3.83.88"> キャスト </h4>
-<p><code>nsCOMPtr</code> では、旧式の C のキャストを使わないでください。旧式のキャストは、たとえそれが正しくないとしても、コンパイルできることが保障されています。旧式のキャストは、もし変換が定義されていないのであれば、<code>reinterpret_cast</code> と同じものにしてしまいます。そのようなキャストは、<code>nsCOMPtr</code> の機構を容易にバイパスしてしまい、リークの発生、型の不一致、その他の不幸な出来事を招きます。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 旧式の C のキャストが |nsCOMPtr| 機構をバイパスし、リークを発生させる...</span>
-
-nsresult rv;
-nsCOMPtr&lt;nsIFoo&gt; foo = ...;
-
-<span class="comment">// ...</span>
-rv = GetFoo( <span class="warning">(nsIFoo**)&amp;foo</span> );
-rv = GetFoo( <span class="warning">&amp;(nsIFoo*)foo</span> );
- <span class="comment">// もちろん、これらはコンパイルできます。でもリークしてしまいます。</span>
-</pre>
-</td></tr></tbody></table>
-<p>これを防ぐのを助けるために、上記のように <code>operator&amp;</code> を <code>private</code> にすることにより、最初の形を不法とすることを試みます。<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=59414" title="FIXED: misuse of nsCOMPtr::operator&amp;">バグ 59414</a> を参照してまださい。
-</p>
-<h4 id=".E5.AE.9F.E8.A3.85.E3.81.AE.E8.A9.B3.E7.B4.B0.E3.81.A8.E3.83.87.E3.83.90.E3.83.83.E3.82.B0.E6.A9.9F.E6.A7.8B" name=".E5.AE.9F.E8.A3.85.E3.81.AE.E8.A9.B3.E7.B4.B0.E3.81.A8.E3.83.87.E3.83.90.E3.83.83.E3.82.B0.E6.A9.9F.E6.A7.8B"> 実装の詳細とデバッグ機構 </h4>
-<p><code>nsCOMPtr</code> はクラスですが、virtual なメソッドを持っていません。つまり、vtable または vptr を持っていません。キーとなるいくつかのルーチンが共通の非テンプレートの基底クラスに分解されるので、実際の元のポインタは、<code>nsISupports*</code> として保存されます (ただしデバッグビルドで <code>NSCAP_FEATURE_DEBUG_PTR_TYPES</code> がオンになっている場合は除きます)。それは、これらの分解されたルーチンのために、<code>nsCOMPtr</code> のユーザが XPCOM ライブラリとリンクしなければいけないからです。
-</p><p><code>NSCAP_FEATURE_DEBUG_PTR_TYPES</code> がオンになっている時、<code>nsISupports*</code> 型の変数に元のポインタを保持する代わりに、<code>nsCOMPtr</code> は、元の型に適合するポインタに保持します。これにより、ソースレベルのデバッガがより簡単にポインタを「追跡」できるようになります。しかしながら、基底クラスに分解されるルーチンは、今やテンプレート特有のインラインコードとなります。分解される基底クラスはありません。これは、すべてのアプリケーションが <code>NSCAP_FEATURE_DEBUG_PTR_TYPES</code> について同じ設定でコンパイルされなければならないことを意味します。そうでないと、いくつかの部分では基底クラスを期待し、他の部分ではそうでないことを期待することになります。アプリケーションは、リンクできないでしょう。
-</p>
-<h4 id=".E3.83.A6.E3.83.8B.E3.83.83.E3.83.88.E3.83.86.E3.82.B9.E3.83.88" name=".E3.83.A6.E3.83.8B.E3.83.83.E3.83.88.E3.83.86.E3.82.B9.E3.83.88"> ユニットテスト </h4>
-<p><code>nsCOMPtr</code>のためのユニットテストは、このファイルにあります。
-</p>
-<ul><li> <code><a href="https://dxr.mozilla.org/mozilla-central/source//xpcom/tests/TestCOMPtr.cpp" rel="custom">/xpcom/tests/TestCOMPtr.cpp</a></code>
-</li></ul>
-<h3 id=".E5.88.9D.E6.9C.9F.E5.8C.96.E3.81.A8.E4.BB.A3.E5.85.A5" name=".E5.88.9D.E6.9C.9F.E5.8C.96.E3.81.A8.E4.BB.A3.E5.85.A5"> 初期化と代入 </h3>
-<h4 id=".E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF.E5.BD.A2.E5.BC.8F" name=".E7.B5.84.E3.81.BF.E8.BE.BC.E3.81.BF.E5.BD.A2.E5.BC.8F"> 組み込み形式 </h4>
-<p><code>nsCOMPtr</code> への代入や初期化は、簡単に理解できます。<code>nsCOMPtr</code> は、その古い値がもしあれば <code>Release</code> し、そして新しい値を代入し、<code>AddRef</code> を呼び出し、および/または、あなたが直接「注釈」することによって <code>dont_AddRef</code> のような指示子で代入する <code>QueryInterface</code> を呼び出します。このセクションでは、それぞれ起こりうる場合を記述します。ただし、指示子については、より簡潔に以下の表で記述しています。
-</p><p>あなたは、<code>nsCOMPtr</code> を以下のものから構築するか、以下のものから代入することができます。
-</p>
-<ul><li> 値 <code>0</code>
-</li><li> 同じ型の他の <code>nsCOMPtr</code>
-</li><li> 同じ型の生の [XP]COM インタフェースポインタ
-</li><li> 同じ型の生の [XP]COM インタフェースポインタで、かつ <a href="#nsCOMPtr.3CT.3E_.3D_T.2A.2CnsCOMPtr.3CT.3E_.3D_dont_QueryInterface.28_T.2A_.29"><code>dont_QueryInterface</code></a> 指示子により注釈されたもの。
-</li><li> 同じ型の生の [XP]COM インタフェースポインタで、かつ <a href="#nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29"><code>dont_AddRef</code></a> 指示子や同様のものにより注釈されたもの。
-</li><li> 任意の型の任意のインタフェースポインタ (<code>nsCOMPtr</code> でも、生の [XP]COM インタフェースポインタでも) で、かつ <a href="#nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29"><code>do_QueryInterface</code></a> 指示子により注釈されたもの。
-</li><li> <a href="#nsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A.2C_nsresult.2A_.29"><code>do_QueryReferent</code></a> 指示子
-</li></ul>
-<p>最初の三つは、単純で明らかです。4 番目のもの (<code>dont_QueryInterface</code> 指示子の適用) は、同じ型の生の [XP]COM インタフェースポインタの代入と同じことです。残りの指示子は、特殊な状況において、いくつかの付加的な制御を提供するものです。さらに、<code>nsCOMPtr</code> を初期値なしで構築することができ、その場合は、<code>0</code> で初期化されます。ちょうどプリミティブなポインタのように、値が<code>0</code>の<code>nsCOMPtr</code> は、どのオブジェクトも指しません。そして、<code>if (foo)</code> や <code>if (!foo)</code> のように式をテストすることができます。
-</p><p>上述した指示は、この表によりもっとはっきりするでしょう。
-</p>
-<table>
-<caption> 表 1. <code>nsCOMPtr</code>に代入するオプション
-</caption>
-<tbody><tr>
-<td>
-</td><td> QueryInterface しない
-</td><td> QueryInterface する
-</td></tr>
-<tr>
-<td> <code>AddRef</code> する
-</td><td>
-<p><a href="#nsCOMPtr.3CT.3E_.3D_T.2A.2CnsCOMPtr.3CT.3E_.3D_dont_QueryInterface.28_T.2A_.29">T*,<br><code>dont_QueryInterface(T*)</code></a>
-</p>
-</td><td>
-<p><a href="#nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29"><code>do_QueryInterface(nsISupports*)</code>, <br><code>do_QueryInterface(nsISupports*, nsresult*)</code></a> <a href="#nsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A.2C_nsresult.2A_.29"><code>do_QueryReferent(nsIWeakReference*)</code>, <br><code>do_QueryReferent(nsIWeakReference*, nsresult*)</code></a>
-</p>
-</td></tr>
-<tr>
-<td> <code>AddRef</code> しない
-</td><td>
-<p><a href="#nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29"><code>dont_AddRef(T*)</code>,<br><code>getter_AddRefs(T*)</code></a>
-</p>
-</td><td>
-<p><a href="#nsCOMPtr.3CT.3E_.3D_.2F.2A_call_QueryInterface_but_don.27t_AddRef_.2A.2F">n/a</a>
-</p>
-</td></tr></tbody></table>
-<p>例えば、<code>nsCOMPtr</code> への代入において、(なんらかの理由ですでに <code>AddRef</code> を実行したために)代入するポインタに対して <code>AddRef</code> を実行したくない場合、「<code>AddRefしない</code>」と「QueryInterface しない」の交差する所にある <code>dont_AddRef(T*)</code> を使うのは一つの可能性です。以下に、<code>dont_AddRef</code>を使い、様々な位置にそれらの「注釈」が表れるサンプルを示します。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// |nsCOMPtr| への代入を管理する...</span>
-
- <span class="comment">// コンストラクタにおいて...</span>
-nsCOMPtr&lt;nsIFoo&gt; foo1( <span class="notice">dont_AddRef(</span>rawFoo1Ptr<span class="notice">)</span> );
-nsCOMPtr&lt;nsIFoo&gt; foo2 = <span class="notice">dont_AddRef(</span>rawFoo2Ptr<span class="notice">)</span><span class="nowiki">;
- </span><span class="comment">// (直接の初期化と呼ばれる) 関数の形式と (コピーの初期化と呼ばれる)</span>
- <span class="comment">// コンストラクタの代入の形式は、微妙に異なる意味を</span>
- <span class="comment">// 持つことに注意してください。直接の初期化の方が好ましい。</span>
-
-nsCOMPtr&lt;nsIFoo&gt; foo3;
-
- <span class="comment">// 通常の代入において...</span>
-foo3 = <span class="notice">dont_AddRef(</span>rawFoo3Ptr<span class="notice">)</span><span class="nowiki">;
-
- </span><span class="comment">// 表で記述されている注釈をコンストラクタと</span>
- <span class="comment">// 単純で古いタイプの代入に適用しています。</span>
-</pre>
-</td></tr></tbody></table>
-<p>表に示されたどの注釈も <code>dont_AddRef()</code> を使って示されたすべての場所に出現可能です。続くセクションでそれぞれの可能性を記述します。
-</p>
-<h5 id="nsCOMPtr.3CT.3E_.3D_T.2A.2CnsCOMPtr.3CT.3E_.3D_dont_QueryInterface.28_T.2A_.29" name="nsCOMPtr.3CT.3E_.3D_T.2A.2CnsCOMPtr.3CT.3E_.3D_dont_QueryInterface.28_T.2A_.29"> <code>nsCOMPtr&lt;T&gt; = T*</code>,<br><code>nsCOMPtr&lt;T&gt; = dont_QueryInterface( T* )</code> </h5>
-<p>表で <code>T*</code> として示されるデフォルトの振舞いでは、新しい値に対して、<code>AddRef</code> を実行します。しかし、それに対して、<code>QueryInterface</code> は実行しません。「注釈」がない時に何が起きるかという例を示します。例えば、
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval">nsCOMPtr&lt;nsIFoo&gt; foo( aFooPtr ); <span class="comment">// もしくは</span>
-foo = aFooPtr;
- <span class="comment">// ...|AddRef| は呼び出しますが、|QueryInterface| は呼び出しません。|</span>
-
- <span class="comment">// 同じものをより明示的に表すと...</span>
-nsCOMPtr&lt;nsIFoo&gt; foo( <span class="notice">dont_QueryInterface(</span>aFooPtr<span class="notice">)</span> ); <span class="comment">// もしくは</span>
-foo = <span class="notice">dont_QueryInterface(</span>aFooPtr<span class="notice">)</span><span class="nowiki">;
- </span>
-</pre>
-</td></tr></tbody></table>
-<p>この形式を使うことにより、あなたが代入しているポインタがすでに、<code>nsCOMPtr</code> の元の型、この場合は、<code>nsIFoo</code> に適合している、[XP]COMとして正しいインタフェースへのポインタであることを約束していることになります。
-</p>
-<h5 id="nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29" name="nsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryInterface.28_nsISupports.2A.2C_nsresult.2A_.29"> <code>nsCOMPtr&lt;T&gt; = do_QueryInterface( nsISupports* )</code>,<br><code>nsCOMPtr&lt;T&gt; = do_QueryInterface( nsISupports*, nsresult* )</code> </h5>
-<p>もし、上記の約束を果たせない時は、<code>nsCOMPtr</code> に対して、代入において <code>QueryInterface</code> を呼び出す必要があると、「注釈」をすることができます。例えば、
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval">nsCOMPtr&lt;nsIFoo&gt; foo( <span class="notice">do_QueryInterface(</span>aBarPtr<span class="notice">)</span> ); <span class="comment">// もしくは</span>
-foo = <span class="notice">do_QueryInterface(</span>aBarPtr<span class="notice">)</span><span class="nowiki">;
- </span><span class="comment">// ...|QueryInterface| が呼ばれる _でしょう_。(その結果 |AddRef| も呼ばれます)</span>
-
- <span class="comment">// もちろん、|QueryInterface| を呼んでいるので、</span>
- <span class="comment">// エラー結果も必要になるでしょう...</span>
-nsresult rv;
-nsCOMPtr&lt;nsIFoo&gt; foo( <span class="notice">do_QueryInterface(</span>aBarPtr<span class="notice">, &amp;rv)</span> ); <span class="comment">// もしくは</span>
-foo = <span class="notice">do_QueryInterface(</span>aBarPtr<span class="notice">, &amp;rv)</span><span class="nowiki">;
- </span>
-</pre>
-</td></tr></tbody></table>
-<h5 id="nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29" name="nsCOMPtr.3CT.3E_.3D_dont_AddRef.28_T.2A_.29.2CnsCOMPtr.3CT.3E_.3D_getter_AddRefs.28_T.2A_.29"> <code>nsCOMPtr&lt;T&gt; = dont_AddRef( T* )</code>,<br><code>nsCOMPtr&lt;T&gt; = getter_AddRefs( T* )</code> </h5>
-<p>時々、すでに <code>AddRef</code> が実行されたポインタをたまたま持っていて、それを <code>nsCOMPtr</code> に代入したい場合があるでしょう。これは、しばしば、(<code>nsresult</code> を結果とするのではなく) <code>AddRef</code> が実行されたポインタを結果として返す getter を使った時に起きます。あるいは、効率性のための変形により起きる場合もあります。<code>dont_AddRef</code> は、このような場合の完璧な治療法です。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval">nsIFoo* temp;
-nsresult rv = GetFoo(&amp;temp);
-nsCOMPtr&lt;nsIFoo&gt; foo( <span class="notice">dont_AddRef(</span>temp<span class="notice">)</span> );
- <span class="comment">// |temp| はすでに |AddRef| を実行済ですが、我々はこれを</span>
- <span class="comment">// |nsCOMPtr| で管理しようとしています。.</span>
-
-nsCOMPtr&lt;nsIFoo&gt; foo( <span class="notice">getter_AddRefs(</span>CreateAFoo()<span class="notice">)</span> );
- <span class="comment">// |getter_AddRefs| は |dont_AddRef| の同意語です。</span>
- <span class="comment">// これは、|AddRef| が実行されたポインタを返す関数に適用する時に分かりやすくするものです。</span>
-
-nsCOMPtr&lt;nsIFoo&gt; foo( <span class="notice">dont_AddRef(</span>CreateAFoo()<span class="notice">)</span> );
- <span class="comment">// あるいは、あなたはそれが好きではないかもしれません...</span>
-</pre>
-</td></tr></tbody></table>
-<h5 id="nsCOMPtr.3CT.3E_.3D_.2F.2A_QueryInterface_.E3.82.92.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97.E3.81.BE.E3.81.99.E3.81.8C.E3.80.81AddRef_.E3.81.AF.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97.E3.81.BE.E3.81.9B.E3.82.93.E3.80.82_.2A.2F" name="nsCOMPtr.3CT.3E_.3D_.2F.2A_QueryInterface_.E3.82.92.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97.E3.81.BE.E3.81.99.E3.81.8C.E3.80.81AddRef_.E3.81.AF.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97.E3.81.BE.E3.81.9B.E3.82.93.E3.80.82_.2A.2F"> <code>nsCOMPtr&lt;T&gt; = </code>/* <code>QueryInterface</code> を呼び出しますが、<code>AddRef</code> は呼び出しません。 */ </h5>
-<p>表のこの象限が「n/a (not applicable)」とマークされているのに気づくでしょう。「<code>QueryInterface</code> を呼び出すが、<code>AddRef</code> を行わないこと」を意味する明示的な指令はありません。このオプションは、間違った型のオブジェクトを返す getter を呼び出す状況に対応します。すでに <code>AddRef</code> を実行したオブジェクトを持っているので、もう AddRef を実行したくないが、違うインタフェースを得る必要がある場合です。それはできません。<code>QueryInterface</code> は、常に <code>AddRef</code> をその結果に対して実行します。そして、正しい型を得るための <code>QueryInterface</code> の呼び出しの代用品は存在しません。解決するには、2 段階のプロセスを実行します。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// ...</span>
-
- <span class="comment">// getter は (間違った型の) すでに |AddRef| を実行したオブジェクトを返します...</span>
-nsCOMPtr&lt;nsIBar&gt; bar( <span class="notice">getter_AddRefs(</span>CreateBar()<span class="notice">)</span> );
- <span class="comment">// ...(このオブジェクトに対して) 正しい型を問い合わせる必要があります。</span>
-nsCOMPtr&lt;nsIFoo&gt; foo( <span class="notice">do_QueryInterface(</span>bar<span class="notice">)</span> );
-</pre>
-</td></tr></tbody></table>
-<p>この場合において、人々が陥る不運なワナは、getter 関数が結果を <code>AddRef</code> していることを忘れることです。こんな感じのコードをタイプしてしまいます:
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval">nsCOMPtr&lt;nsIFoo&gt; foo( <span class="warning">do_QueryInterface(CreateBar())</span> );
- <span class="comment">// おっと! |CreateBar| によって返ってくるインタフェースがリークしてしまいます。</span>
- <span class="comment">// この場合、あなたは上に示した二つのステップの解決法で処理する_必要_があります。</span>
-
- <span class="comment">// ありそうもないですか? こんな感じの形で見ることはあるでしょう。</span>
-nsCOMPtr&lt;nsIFoo&gt; foo( <span class="warning">do_QueryInterface(aList-&gt;ElementAt(i))</span> );
- <span class="comment">// すべての良い getter のように、|ElementAt| は、</span>
- <span class="comment">// インタフェースからの必要性に応じて問い合わせを行なった後、</span>
- <span class="comment">// 破棄されるかも知れない結果を |AddRef| します。</span>
-</pre>
-</td></tr></tbody></table>
-<p>Bugzilla <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=8221" title="FIXED: MLK - Mem Leak's found with the scc wonder query - nsCOMPtr = do_QueryInterface..">バグ 8221</a> は、この特定のリークの発見と修正に限定されたものです。
-</p>
-<h4 id="nsCOMPtr_.E3.83.98.E3.83.AB.E3.83.91.E3.83.BC" name="nsCOMPtr_.E3.83.98.E3.83.AB.E3.83.91.E3.83.BC"> <code>nsCOMPtr</code> ヘルパー </h4>
-<h5 id="nsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A.2C_nsresult.2A_.29" name="nsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A.2C_nsresult.2A_.29"> <code>nsCOMPtr&lt;T&gt; = do_QueryReferent( nsIWeakReference* )</code>,<br><code>nsCOMPtr&lt;T&gt; = do_QueryReferent( nsIWeakReference*, nsresult* )</code> </h5>
-<p><a href="ja/Weak_reference"><code>nsIWeakReference</code></a> に基づく弱い参照を容易にする <code>do_QueryReferent</code> というのがあります。<code>nsIWeakReference</code> は、他のオブジェクトのプロキシとして振舞う [XP]COM オブジェクトです。<code>nsIWeakReference</code> と (上記の) 他のオブジェクトは、特別な関係にあります。それらは、お互いのことを知っています。しかし、どちらももう一方への所有する参照を保持していません。二つのオブジェクトは、もう一方へのダングリングポインタを持たないことを保障するように協調しています。<code>nsIWeakReference</code> オブジェクトにおいて所有する参照を保持することにより、この他のオブジェクトを必要な時に得ることができ、しかし、それ (他のオブジェクト) が生きていなくてもよいのです。そのオブジェクトを得るためには、<code>nsIWeakReference</code> オブジェクトに、あなたの代わりに <code>QueryInterface</code> するように依頼します。もしオブジェクトがまだ存在しており、要求されたインタフェースをサポートしているのであれば、あなたは (できれば、一時的に) それに対する所有する参照を持つことができます。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval">nsIWeakReference* weakPtr = ...;
-
-weakPtr-&gt;QueryReferent(
-</pre>
-</td></tr></tbody></table>
-<h3 id="T.2A_.E3.81.A8.E3.81.97.E3.81.A6_nsCOMPtr.3CT.3E_.E3.82.92.E4.BD.BF.E3.81.86" name="T.2A_.E3.81.A8.E3.81.97.E3.81.A6_nsCOMPtr.3CT.3E_.E3.82.92.E4.BD.BF.E3.81.86"> <code>T*</code> として <code>nsCOMPtr&lt;T&gt;</code> を使う</h3>
-<h4 id="nsCOMPtr.E3.82.92.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.81.A8.E3.81.97.E3.81.A6.E4.BD.BF.E3.81.86" name="nsCOMPtr.E3.82.92.E3.83.9D.E3.82.A4.E3.83.B3.E3.82.BF.E3.81.A8.E3.81.97.E3.81.A6.E4.BD.BF.E3.81.86"> <code>nsCOMPtr</code>をポインタとして使う </h4>
-<h4 id=".E3.80.8C.E5.85.A5.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF" name=".E3.80.8C.E5.85.A5.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF"> 「入力」パラメタ </h4>
-<h4 id=".E3.80.8C.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF_getter_AddRefs" name=".E3.80.8C.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF:_getter_AddRefs"> 「出力」パラメタ: <code>getter_AddRefs</code> </h4>
-<p><code>nsCOMPtr</code> への代入は、とても理解しやすいです。<code>nsCOMPtr</code> は、古い値がもしあれば、それを <code>Release</code> します。そして、代入した新しい値を <code>AddRef</code> し、および/または上述した指令に示された<code>QueryInterface</code> を呼び出します。これらの規則は、<code>nsCOMPtr</code> として宣言されたパラメタや関数の復帰値のコピーにおいて起こる「代入」でも同じく適用されます。もし <code>nsCOMPtr</code> を生の [XP]COM インタフェースポインタの実用的な代用品としたいのであれば、しかしながら、「出力」パラメタの問題に対処する必要があります。多くの [XP]COM 関数は、結果のインタフェースポインタをパラメタを通じて返します。例えば、
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// Getter は、インタフェースポインタを「出力」パラメタを通じて返すことができます。...</span>
-
-nsresult GetFoo( nsIFoo** ); <span class="comment">// 標準的 getter</span>
-nsresult GetFoo2( nsIFoo*&amp; ); <span class="comment">// 非標準的 getter</span>
-nsresult GetSomething( void** ); <span class="comment">// 「型無し」の getter</span>
- <span class="comment">// 注: |QueryInterface| は、「型無し」の getter の例です。</span>
-</pre>
-</td></tr></tbody></table>
-<p>我々は、「出力」パラメタを使うルーチンへポインタや参照によって <code>nsCOMPtr</code> を渡せなければいけません。問題は、getter 内部には、<code>nsCOMPtr</code> に対する情報がないことです。それは、生の [XP]COM インタフェースポインタへのポインタ (または参照) を得ていると考えます。<code>nsCOMPtr</code> のスマートな代入演算子は、呼ばれません。古い値があれば、リークしてしまいます。
-</p><p>ここで、<code>getter_AddRefs( nsCOMPtr&amp; )</code>が役に立ちます。<code>getter_AddRefs</code> は、古い値があれば <code>Release</code> し、それをクリアします。そして、それに対するポインタを返し、getter は <code>nsCOMPtr</code>に<code>AddRef</code> を実行した新しい値を設定します。我々は、これらの状況で、生の [XP]COM インタフェースポインタに適用していた <code>&amp;</code> を置き換えるものとして、<code>getter_AddRef</code> を使用します。<code>getter_AddRefs</code> は、通常 <code>nsCOMPtr</code> のコンストラクタと代入演算子から得ていた魔法を詰めこんだものです。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 生の [XP]COM インタフェースポインタ...</span>
-
-nsIFoo<span class="notice"><span class="nowiki">*</span></span> foo;
-
-GetFoo(<span class="notice">&amp;</span>foo);
-GetFoo2(foo);
-GetSomething(<span class="notice">(void**)&amp;</span>foo);
-</pre>
-</td><td>
-<pre class="eval"><span class="comment">// |nsCOMPtr|...</span>
-
-<span class="notice">nsCOMPtr&lt;</span>nsIFoo<span class="notice">&gt;</span> foo;
-
-GetFoo(<span class="notice">getter_AddRefs(</span>foo<span class="notice">)</span>);
-GetFoo2(<span class="notice"><span class="nowiki">*getter_AddRefs(</span></span>foo<span class="notice">)</span>);
-GetSomething(<span class="notice">getter_AddRefs(</span>foo<span class="notice">)</span>);
-</pre>
-</td></tr></tbody></table>
-<p>これを実現するのに、なぜ単に <code>operator&amp;</code> をオーバーロードしないのでしょうか? いくつかの理由: 他の状況では、<code>nsCOMPtr</code> のアドレスを取るのは、不便なことになります。「<code>getter_AddRefs</code>」という名前は、getter としてある一定の振舞いを強制します。そして、かつては、他の可能性がありました (あなたがまさに学ぼうとしているように)。
-</p><p>パラメタを通じて復帰値を返しますが、<code>AddRef</code> を実行していない getter のために、<code>getter_doesnt_AddRef( nsCOMPtr&amp; )</code> というのは、ありますか? いいえ、ありません。かつてありましたが、それは 3 つの理由でなくなりました:
-</p>
-<ul><li> getter がパラメタを通じて <code>AddRef</code> を実行していないインタフェースポインタを返すのは、[XP]COM の規則に反しています。(もしそれを見つけたら、バグ報告をしてください。)
-</li><li> <code>getter_doesnt_AddRef</code> は、<code>nsCOMPtr</code> を生の [XP]COM インタフェースポインタよりも大きく、または遅くしてしまう複雑な波及効果があります。
-</li><li> とりあえず、そのような getter を呼んで、一時的に<code>nsCOMPtr</code>に結果を入れることもできます。例えば、
-</li></ul>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// その結果に対して、|AddRef| を (違法に) 呼び出さない getter を呼び出します...</span>
-
-nsIFoo* temp;
-nsresult rv = <span class="warning">GetFoo_WithoutAddRef(</span>&amp;temp<span class="warning">)</span><span class="nowiki">;
- </span><span class="comment">// 自分への注: |GetFoo_WithoutAddRef| をバグとして報告しなければならない。</span>
- <span class="comment">// すべての getter は、 |AddRef| しなければならない。</span>
-nsCOMPtr&lt;nsIFoo&gt; foo = temp;
-</pre>
-</td></tr></tbody></table>
-<h4 id=".E3.80.8C.E5.85.A5.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF" name=".E3.80.8C.E5.85.A5.E5.87.BA.E5.8A.9B.E3.80.8D.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF"> 「入出力」パラメタ </h4>
-<p>「入力/出力」パラメタについては、どうなんでしょう?
-</p>
-<h3 id=".E5.8A.B9.E7.8E.87.E6.80.A7.E3.81.A8.E6.AD.A3.E7.A2.BA.E6.80.A7" name=".E5.8A.B9.E7.8E.87.E6.80.A7.E3.81.A8.E6.AD.A3.E7.A2.BA.E6.80.A7"> 効率性と正確性 </h3>
-<h4 id="nsCOMPtr.E3.81.AE.E3.82.B3.E3.82.B9.E3.83.88" name="nsCOMPtr.E3.81.AE.E3.82.B3.E3.82.B9.E3.83.88"> <code>nsCOMPtr</code>のコスト </h4>
-<p><code>nsCOMPtr</code> は、生の [XP]COM インタフェースポインタに対する実用的な置き換えとなるべく調整されています。所有する参照として使うのであれば、どの場所においてもです。<code>nsCOMPtr</code>s のパフォーマンスについては一般的に、スペース的には少し効率が<em>よく</em>、時間的には、ごくわずかに効率が悪いです。パフォーマンスに関することにより、<code>nsCOMPtr</code> を使わないのは良くありません。このセクションを通じて提示するパターンが<code>nsCOMPtr</code> からより多くのものを引き出すのを手伝ってくれるでしょう。
-</p>
-<h5 id=".E3.82.B9.E3.83.9A.E3.83.BC.E3.82.B9" name=".E3.82.B9.E3.83.9A.E3.83.BC.E3.82.B9"> スペース </h5>
-<p>一般的に、<code>nsCOMPtr</code>は、生の [XP]COM ポインタを使うよりもスペース的には、効率がよくなる<i>可能性</i>があります。これは主にそのデストラクタの分解とより複雑なコンストラクタと代入演算子のためです。このセクションの最適化の tips に従うことで、生のポインタで使用するのよりもオブジェクトの生成するバイトがより少ないコードを書くことができるでしょう。これらの忠告に従わないとしても、<code>nsCOMPtr</code> のコードは、依然として、より小さくなり、あるいは最悪でも生のポインタ版よりもごくわずか増えるだけです。詳細については、<a class="external" href="http://www.mozilla.org/projects/xpcom/nsCOMPtr/bloat.html">Code Bloat [長文、要約が最初にあります</a>] を見てください。もっとも、ここでは、そのドキュメントからの推奨事項を繰り返しています。
-</p>
-<h5 id=".E6.99.82.E9.96.93" name=".E6.99.82.E9.96.93"> 時間 </h5>
-<p><span class="editor-note"><span class="nowiki">[[もっと時間パフォーマンスの測定が必要です。]]</span></span>
-</p><p>二つ以上のサブルーチン、すなわち <code>AddRef</code>、<code>Release</code>、<code>QueryInterface</code> が必要な場所では、いくつかの <code>nsCOMPtr</code>ル ーチンが分解され、そのためサブルーチンを呼び出しと対応する付加的な時間を必要とします。この時間は、特に <code>QueryInterface</code> により行われる作業や <code>Release</code> により行われるかもしれない作業にもかかわらず、極わずかです。
-</p><p>その他のすべての場合、<code>nsCOMPtr</code> は手で行われる作業をするだけです。<code>nsCOMPtr</code> が使用される作業の大部分は、<code>operator-&gt;</code> での間接参照であり、原始的なポインタが行うものと同じです。この操作は、すべてのプラットフォームで、生の [XP]COM インタフェースポインタでの操作とちょうど同じコードを作り出し、そして同じ時間を消費します。デストラクタは、クライアントコードが生の [XP]COM インタフェースポインタに対して、<code>Release</code> を呼び出すのに対応しますが、処理が分解されているため、サブルーチンを呼び出すための余分な時間が必要となります。もっとも、これは、<code>delete</code> を実行するかもしれない <code>Release</code> の呼び出しと参照する方のデストラクタの両方の場合においてすでに存在するコストに対して、バランスが取れています。すべての <code>nsCOMPtr</code> のコンストラクタと代入演算子は、インラインです。単純なコンストラクタ、すなわち問い合わせをしないもの、は、あなたが手で書いたものと同じ作業だけを行います。<code>AddRef</code>、<code>Release</code>、<code>QueryInterface</code> の中の一つ以上の呼び出しを行うすべてのルーチンは、分解されており、そのため、サブルーチン呼び出しの余分なコストを含んでいます。
-</p><p>いくつかのルーチンが分解されているという事実により、余分なサブルーチン呼び出しのオーバーヘッドが生じます。そして、その事実および初期化がバイパスできないという事実によって、生の [XP]COM インタフェースポインタに対して、<code>nsCOMPtr</code> が余分な実行時間のコストを生じるのです。スペースと時間のトレードオフは、<code>nsCOMPtr</code> において見事にバランスが取れています。分解されたルーチンは、膨張に関する測定の直接的な結果です。
-</p>
-<h4 id=".E4.BB.A3.E5.85.A5.E3.81.AE.E5.A5.BD.E3.81.BE.E3.81.97.E3.81.84.E6.A7.8B.E7.AF.89" name=".E4.BB.A3.E5.85.A5.E3.81.AE.E5.A5.BD.E3.81.BE.E3.81.97.E3.81.84.E6.A7.8B.E7.AF.89"> 代入の好ましい構築 </h4>
-<p>時間においてもスペースにおいても、<code>nsCOMPtr</code> への値の代入の最も効率的な方法は、構築時におけるものです。合理的である限り、代入しながら構築する方が好ましいです。<code>nsCOMPtr</code> のメンバをコンストラクタのメンバ初期化節で初期化すべきです。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// |nsCOMPtr| のメンバをコンストラクタの</span>
-<span class="comment">// メンバ初期化節で初期化する...</span>
-
-class Bar
- {
- public:
- Bar( nsIFoo* initial_fooPtr );
- <span class="comment">// ...</span>
- private:
- nsCOMPtr&lt;nsIFoo&gt; mFooPtr;
- };
-
-Bar::Bar( nsIFoo* initial_fooPtr )
-  : <span class="notice">mFooPtr(initial_fooPtr)</span> <span class="comment">// _ここで_ 初期化します</span>
- {
- <span class="comment">// ここではありません。</span>
- }
-</pre>
-</td></tr></tbody></table>
-<p>付け加えておくと、代入の形式を構築の形式に変換する一時的オブジェクトを使う、最適化のパターンがあります。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 後に代入が続くデフォルトの</span>
-<span class="comment">// 構築は非効率的です...</span>
-
-nsCOMPtr&lt;nsIFoo&gt; foo;
-nsresult rv=GetFoo(getter_AddRefs(foo));
-
-
-
-
-
-</pre>
-</td><td>
-<pre class="eval"><span class="comment">// ...構築だけをします。</span>
-
-<span class="notice">nsIFoo* temp;</span>
-nsresult rv=GetFoo(<span class="notice">&amp;temp</span>);
-nsCOMPtr&lt;nsIFoo&gt; foo<span class="notice"><span class="nowiki">=dont_AddRef(temp);</span></span>
-
- <span class="comment">// この「生のポインタ、getter の呼び出し、</span>
- <span class="comment">// |dont_AddRef| の代入」パターンを覚えて</span>
- <span class="comment">// ください。それは、多くの効率に関する</span>
- <span class="comment">// 議論で出てきたものです。</span>
-</pre>
-</td></tr></tbody></table>
-<p>どちらの場合も、あなたは、正当な <code>nsCOMPtr</code> で、その値として <code>GetFoo</code> の結果が設定された <code>foo</code> というオブジェクト、および <code>GetFoo</code> により返された <code>rv</code> という状態を得ます。しかしながら、一時的変数を使う場合は、<code>nsCOMPtr</code> への値の設定をする構築を使っており、(ソース上では、少し複雑になっていますが)、代入に続くデフォルトの構築よりは、効率的になっています。そして、より簡単な例によって、このイベントの過程は理解されるでしょう。
-</p>
-<h4 id=".E4.BB.A3.E5.85.A5.E3.81.AB.E3.81.8A.E3.81.91.E3.82.8B.E5.A5.BD.E3.81.BE.E3.81.97.E3.81.84.E7.A0.B4.E5.A3.8A" name=".E4.BB.A3.E5.85.A5.E3.81.AB.E3.81.8A.E3.81.91.E3.82.8B.E5.A5.BD.E3.81.BE.E3.81.97.E3.81.84.E7.A0.B4.E5.A3.8A"> 代入における好ましい破壊 </h4>
-<h4 id="QueryInterface_.E3.81.AE.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97.E3.82.88.E3.82.8A.E3.82.82_do_QueryInterface_.E3.81.AE.E6.96.B9.E3.81.8C.E6.9C.9B.E3.81.BE.E3.81.97.E3.81.84.E3.81.A7.E3.81.99.E3.80.82" name="QueryInterface_.E3.81.AE.E5.91.BC.E3.81.B3.E5.87.BA.E3.81.97.E3.82.88.E3.82.8A.E3.82.82_do_QueryInterface_.E3.81.AE.E6.96.B9.E3.81.8C.E6.9C.9B.E3.81.BE.E3.81.97.E3.81.84.E3.81.A7.E3.81.99.E3.80.82"> <code>QueryInterface</code> の呼び出しよりも <code>do_QueryInterface</code> の方が望ましいです。 </h4>
-<h4 id=".E7.B9.B0.E3.82.8A.E8.BF.94.E3.81.97" name=".E7.B9.B0.E3.82.8A.E8.BF.94.E3.81.97"> 繰り返し </h4>
-<p>これは、普通のポインタでデータ構造の繰り返しをする時の共通のイディオムです。例えば、
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// [XP]COM オブジェクトでないものに対してポインタで繰り返しを行う...</span>
-
-Node* p = ...;
-while ( p )
- {
- <span class="comment">// ...</span>
- p = p-&gt;next;
- }
-</pre>
-</td></tr></tbody></table>
-<p>同様に、このパターンが <code>for</code> ループとしても表現されるのをしばしば見かけます。しかしながら、これを生の [XP]COM インタフェースポインタに対して行うとどうなるか、考えてみてください。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 生の [XP]COM インタフェースポインタで繰り返しを行います...</span>
-
-nsIDOMNode* p = ...;
-while ( p )
- {
- <span class="comment">// ...</span>
- <span class="warning">p-&gt;GetNext(&amp;p);</span>
- <span class="comment">// 問題です! |p| を |Release| せずに上書きしてしまいました。</span>
- }
-</pre>
-</td></tr></tbody></table>
-<p>おっと! <code>p</code> に対して、新しいポインタを設定する前に、<code>Release</code> し損ねてしまいました。みんながこれを多く行うため、これが通常の [XP]COM コードのリークの大きな原因となってしまいました。では、代わりにこうすることはできるのでしょうか ?
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 生の [XP]COM インタフェースポインタで繰り返しを行います...</span>
-
-nsIDOMNode* p = ...;
-while ( p )
- {
- <span class="comment">// ...</span>
- <span class="warning">NS_RELEASE(p);
- p-&gt;GetNext(&amp;p);</span>
- <span class="comment">// 問題です! ダングリングしているか |NULL| であるポインタの</span>
- <span class="comment">// メンバ関数を呼ぼうとしています。</span>
- }
-</pre>
-</td></tr></tbody></table>
-<p>残念ながらダメです。<code>Release</code> した後、<code>nsCOMPtr</code> は、ダングリングしている状態になるかもしれません。実は、<code>NS_RELEASE</code> マクロを使うと、<code>p</code> は、<code>GetNext</code> を呼び出すまでは、<code>NULL</code> になるでしょう。
-</p><p>では、同じことを <code>nsCOMPtr</code> で書いてあると想像してみてください。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// |nsCOMPtr| で繰り返しを行います...</span>
-
-nsCOMPtr&lt;nsIDOMNode&gt; p = ...;
-while ( p )
- {
- <span class="comment">// ...</span>
- <span class="warning">p-&gt;GetNext( getter_AddRefs(p) );</span>
- <span class="comment">// 問題です! |NULL| ポインタを通じてメンバ関数を呼び出そうとしました。</span>
- }
-</pre>
-</td></tr></tbody></table>
-<p>ここでは、<code>nsCOMPtr</code> の使用は、生の [XP]COM インタフェースポインタの使用とほとんど同じです。<code>getter_AddRefs</code> は、 <code>Release</code> し、そしてそれに代入する前に <code>p</code> をクリアします。すなわち、<code>GetNext</code> が呼ばれる前にそれを行います。これは、<code>GetNext</code> の呼び出しを行う前に、<code>NULL</code> ポインタを通じて、呼び出そうとしてしまうことを意味します。生の [XP]COM インタフェースポインタと違い、<code>nsCOMPtr</code> は、盲目的に <code>NULL</code> ポインタを通じて <code>GetNext</code> を呼び出そうとする代わりに、<code>assert</code> を実行します。
-</p><p>これは問題です。では、解決法は、なんでしょうか。もしこれが生の [XP]COM インタフェースであれば、おそらく一時的変数を導入するでしょう。我々は、<code>nsCOMPtr</code>で同じことをすることができます。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 生の [XP]COM インタフェースポインタ</span>
-<span class="comment">// での安全な繰り返し...</span>
-
-nsIDOMNode<span class="notice"><span class="nowiki">*</span></span> p = ...;
-while ( p )
- {
- <span class="comment">// ...</span>
-
- <span class="comment">// 一時的変数を導入することで、</span>
- <span class="comment">// |p| で足踏みをすることもありません。</span>
- nsIDOMNode<span class="notice"><span class="nowiki">*</span></span> temp = p;
- temp-&gt;GetNext(<span class="notice">&amp;</span>p);
- <span class="notice">NS_RELEASE(temp);</span>
- }
-</pre>
-</td><td>
-<pre class="eval"><span class="comment">// |nsCOMPtr| での安全な繰り返し...</span>
-
-
-<span class="notice">nsCOMPtr&lt;</span>nsIDOMNode<span class="notice">&gt;</span> p = ...;
-while ( p )
- {
- <span class="comment">// ...</span>
-
- <span class="comment">// 一時的変数を導入することで、</span>
- <span class="comment">// |p| で足踏みをすることもありません。</span>
- <span class="notice">nsCOMPtr&lt;</span>nsIDOMNode<span class="notice">&gt;</span> temp = p;
- temp-&gt;GetNext(<span class="notice">getter_AddRefs(</span>p<span class="notice">)</span>);
- }
-
-</pre>
-</td></tr></tbody></table>
-<p><code>nsCOMPtr</code> をパラレルにするのは、容易に理解できますが、生のポインタの枠組に比べて、余分な <code>AddRef</code> と <code>Release</code> を一回ずつしなければなりません。少し変形することで、コードは見づらくなりますが、(おそらく、ごくわずかですが) より効率的になります。
-</p>
-<table>
-<tbody><tr>
-<td>
-<pre class="eval"><span class="comment">// 安全で、効率的な、|nsCOMPtr| での繰り返し...</span>
-
-nsCOMPtr&lt;nsIDOMNode&gt; p = ...;
-while ( p )
- {
- <span class="comment">// ...</span>
- nsIDOMNode* next;
- p-&gt;GetNext(&amp;next);
- p = dont_AddRef(next);
- }
-
- <span class="comment">// 見てください! これはおなじみの「生のポインタ、getterの呼び出し、</span>
- <span class="comment">// |dont_AddRef| の代入」パターンです。</span>
-</pre>
-</td></tr></tbody></table>
-<h4 id="getter_.E3.82.92.E6.9B.B8.E3.81.8F" name="getter_.E3.82.92.E6.9B.B8.E3.81.8F"> getter を書く </h4>
-<h3 id=".E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.A9.E3.81.AE.E6.82.A9.E3.81.BF.E3.81.AE.E7.A8.AE" name=".E3.82.B3.E3.83.B3.E3.83.91.E3.82.A4.E3.83.A9.E3.81.AE.E6.82.A9.E3.81.BF.E3.81.AE.E7.A8.AE"> コンパイラの悩みの種 </h3>
-<div class="noinclude">
-</div>
diff --git a/files/ja/mozilla/tech/xpcom/using_nscomptr/status,_recent_changes,_and_plans/index.html b/files/ja/mozilla/tech/xpcom/using_nscomptr/status,_recent_changes,_and_plans/index.html
deleted file mode 100644
index 590fcab98c..0000000000
--- a/files/ja/mozilla/tech/xpcom/using_nscomptr/status,_recent_changes,_and_plans/index.html
+++ /dev/null
@@ -1,36 +0,0 @@
----
-title: 'Status, Recent Changes, and Plans'
-slug: 'Mozilla/Tech/XPCOM/Using_nsCOMPtr/Status,_Recent_Changes,_and_Plans'
-tags:
- - XPCOM
-translation_of: 'Mozilla/Tech/XPCOM/Using_nsCOMPtr/Status,_Recent_Changes,_and_Plans'
----
-<p>
-</p><p>このセクションが、初めて読む人に邪魔になって申し訳ありません。 目次にとばしたり、直接 <a href="ja/Using_nsCOMPtr/Getting_Started_Guide">スタートガイド</a> や <a href="ja/Using_nsCOMPtr/Reference_Manual">リファレンスマニュアル</a>、 <a href="ja/Using_nsCOMPtr/Frequently_Asked_Questions">FAQ</a> に行きたいかもしれません。 このセクションは、最近の更新をチェックするのが簡単になるようにトップに設けています。
-</p><p><br>
-</p>
-<h3 id="nsCOMPtr_.E3.81.AB.E5.AF.BE.E3.81.99.E3.82.8B.E6.9C.80.E8.BF.91.E3.81.AE.E6.9B.B4.E6.96.B0" name="nsCOMPtr_.E3.81.AB.E5.AF.BE.E3.81.99.E3.82.8B.E6.9C.80.E8.BF.91.E3.81.AE.E6.9B.B4.E6.96.B0"> <code>nsCOMPtr</code> に対する最近の更新 </h3>
-<p>新しいものから順に
-</p>
-<ul><li> <code>nsCOMPtr</code> と生のポインタ(もしくはリテラル 0 や nsnull)の間の <code>==</code> と <code>!=</code> がすべてのコンパイラで正しく働くようにしました。<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=65664" title="FIXED: nsCOMPtr: make operator== always work with gcc">バグ 65664</a> を参照してください
-</li><li> <a href="ja/Using_nsCOMPtr/Reference_Manual#.60.E5.87.BA.E5.8A.9B.27.E3.83.91.E3.83.A9.E3.83.A1.E3.82.BF:_getter_AddRefs"><code>getter_AddRefs( nsCOMPtr&amp; )</code></a> に対して、簡単な代入式が行うのと同じ [[Using_nsCOMPtr:Reference_Manual#型の保護手段|type-safety check] を適用します。
-</li><li> <code>do_CreateInstance</code> を追加しました。
-</li><li> <code>do_GetService</code> を追加しました。
-</li><li> <code>nsISupports**</code> が必要な時に <code>getter_AddRefs</code> をキャストする必要性がなくなりました。
-</li><li> <code>nsCOMPtr&lt;nsISupports&gt;</code> の不変性を緩和したので、 任意の [XP]COMインタフェースへのポインタを使うことができるようなりました。
-</li><li> <a href="ja/Weak_reference"><code>nsIWeakReference</code></a> を簡単に使えるように、<a href="ja/Using_nsCOMPtr/Reference_Manual#nsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A_.29.2CnsCOMPtr.3CT.3E_.3D_do_QueryReferent.28_nsIWeakReference.2A.2C_nsresult.2A_.29"><code>do_QueryReferent</code></a> を追加しました。
-</li></ul>
-<h4 id="nsCOMPtr_.E3.81.AE.E8.A8.88.E7.94.BB" name="nsCOMPtr_.E3.81.AE.E8.A8.88.E7.94.BB"> <code>nsCOMPtr</code> の計画 </h4>
-<ul><li> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=59212" title="FIXED: leaks with nsCOMPtr&lt;nsIAtom> foo = NS_NewAtom(...)">バグ 59212</a>: 私たちがより多くのコンパイラでテストできるようになり次第、 <code>already_AddRefed</code> を関数の戻り値として推奨する事を始めます。
-</li><li> <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=59414" title="FIXED: misuse of nsCOMPtr::operator&amp;">バグ 59414</a>: <code>operator&amp;</code> を <code>private</code> とすることで、<a href="ja/Using_nsCOMPtr/Reference_Manual#.E3.82.AD.E3.83.A3.E3.82.B9.E3.83.88">キャストによるリーク</a> のいくつかを防ぐのを助けるでしょう
-</li><li> nsCOMPtr&lt;/code&gt;を複数のルーチンに分解してライブラリに入れます。それにより、<code>nsCOMPtr</code>のクライアントの XPCOM ライブラリへの依存性を減らします。
-</li></ul>
-<h4 id=".E6.9C.80.E8.BF.91.E3.81.AE.E3.83.89.E3.82.AD.E3.83.A5.E3.83.A1.E3.83.B3.E3.83.88.E3.81.AE.E6.9B.B4.E6.96.B0" name=".E6.9C.80.E8.BF.91.E3.81.AE.E3.83.89.E3.82.AD.E3.83.A5.E3.83.A1.E3.83.B3.E3.83.88.E3.81.AE.E6.9B.B4.E6.96.B0"> 最近のドキュメントの更新 </h4>
-<ul><li> <code>nsCOMPtr</code> と生のポインタ、リテラル <code>0</code> との間にある <code><span class="nowiki">==</span></code> と <code><span class="nowiki">!=</span></code> が一部のコンパイラで正しく働かないという記述は、既に問題が解決されたので削除しました。
-</li><li> スタートガイドに <a href="ja/Using_nsCOMPtr/Getting_Started_Guide#.E9.96.A2.E6.95.B0.E8.AD.98.E5.88.A5.E5.AD.90.E5.86.85.E3.81.AE_nsCOMPtr">関数識別子内の <code>nsCOMPtr</code></a> セクション全体を追加しました。
-</li><li> <code>nsCOMPtr</code> 機構を使うことに影響を及ぼす現在のバグへの言及を加えました。<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=59212" title="FIXED: leaks with nsCOMPtr&lt;nsIAtom> foo = NS_NewAtom(...)">バグ 59212</a> と <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=59414" title="FIXED: misuse of nsCOMPtr::operator&amp;">バグ 59414</a>
-</li><li> Morten Welinder のコメントのように、<a href="ja/Using_nsCOMPtr/Getting_Started_Guide#Comparison1">1</a> と<a href="ja/Using_nsCOMPtr/Getting_Started_Guide#Comparison3">3</a> の比較を修正しました。
-</li><li> コピー初期化よりも直接の初期化の方が好ましい例を更新しました。
-</li></ul>
-<div class="noinclude">
-</div>