(57)【要約】【課題】  本発明の目的は、オブジェクトの基準カウントをポインタオブジェクト内に維持する自己基準カウントポインタを提供することである。【解決手段】  本発明のコンピュータを使用したオブジェクト管理方法は、基準カウントオブジェクトを生成し、その基準カウントオブジェクトをオブジェクトのポインタオブジェクトに取付けるステップを含んでいることを特徴とする。【選択図】      図２
2004288191.tif 000002
【特許請求の範囲】
【請求項１】
基準カウントオブジェクトを生成し、
その基準カウントオブジェクトをオブジェクトのポインタオブジェクトに取付けるステップを含んでいるコンピュータを使用したオブジェクト管理方法。
【請求項２】
生成するステップは、そのオブジェクトを参照するステップをさらに含んでいる請求項１記載の方法。
【請求項３】
生成するステップは、そのオブジェクトに対する最初の基準が形成されたときに発生する請求項１記載の方法。
【請求項４】
オブジェクトにはポインタオブジェクトコンストラクタが含まれており、オブジェクトの新しいコピーが生成されたとき、このポインタオブジェクトコンストラクタにより基準カウントオブジェクトをインクリメントするステップをさらに含んでいる請求項１記載の方法。
【請求項５】
オブジェクトにはポインタオブジェクトコンストラクタが含まれており、ポインタオブジェクトがその範囲から外れたとき、基準カウントオブジェクトをデクリメントするステップをさらに含んでいる請求項１記載の方法。
【請求項６】
オブジェクトはベースオブジェクトであり、ポインタオブジェクトはベースポインタオブジェクトであり、ベースオブジェクトはポインタオブジェクトコンストラクタを含み、
導出されたオブジェクトをベースオブジェクトから導出し、
この導出されたオブジェクトにキャストされる第２のポインタオブジェクトをキャストし、
第２のポインタオブジェクトを基準カウントオブジェクトに取付け、
基準カウントオブジェクトをインクリメントするステップをさらに含んでいる請求項１記載の方法。
【請求項７】
導出されたオブジェクトをデリファレンスし、
第２のポインタオブジェクトを削除し、
基準カウントオブジェクトをデクリメントするステップをさらに含んでいる請求項６記載の方法。
【請求項８】
ベースオブジェクトをデリファレンスし、
ベースポインタオブジェクトを削除し、
基準カウントオブジェクトおよびベースオブジェクトを削除するステップをさらに含んでいる請求項７記載の方法。
【請求項９】
ベースオブジェクトをデリファレンスし、
ベースポインタオブジェクトを削除し、
基準カウントオブジェクトをデクリメントするステップをさらに含んでいる請求項６記載の方法。
【請求項１０】
導出されたオブジェクトをデリファレンスし、
第２のポインタオブジェクトを削除し、
基準カウントオブジェクトおよび導出されたオブジェクトを削除するステップをさらに含んでいる請求項９記載の方法。
【請求項１１】
ベースポインタオブジェクトを含むベースオブジェクトを生成し、
基準カウントオブジェクトを生成し、
基準カウントオブジェクトをベースポインタオブジェクトに取付け、
新しいオブジェクトをベースオブジェクトから導出し、そのベースオブジェクトは新しいベースポインタオブジェクトを含み、
新しいオブジェクトが導出されるたびに基準カウントオブジェクトをインクリメントし、
新しいベースポインタオブジェクトを基準カウントオブジェクトに取付けるステップを含んでいるコンピュータを使用してオブジェクトを管理する方法。
【請求項１２】
ベースオブジェクトをデリファレンスし、ベースポインタオブジェクトを基準カウントオブジェクトから切り離し、
基準カウントオブジェクトをデクリメントする請求項１１記載の方法。
【請求項１３】
新しいオブジェクトをデリファレンスし、新しいポインタオブジェクトを基準カウントオブジェクトから切り離し、
基準カウントオブジェクトをデクリメントする請求項１１記載の方法。
【請求項１４】
ベースオブジェクトをデリファレンスし、ベースポインタオブジェクトを基準カウントオブジェクトから切り離し、
基準カウントオブジェクトをデクリメントし、
新しいオブジェクトを削除し、新しいポインタオブジェクトを基準カウントオブジェクトから切り離し、
基準カウントオブジェクトをデクリメントし、
基準カウントオブジェクトを削除する請求項１１記載の方法。
【請求項１５】
基準カウントオブジェクトを生成する命令と、
その基準カウントオブジェクトをオブジェクトのポインタオブジェクトに取付ける命令とを含んでいるオブジェクト管理のためにプログラムコードを符号化するためのコンピュータ読出し可能な記憶媒体。
【請求項１６】
さらに、オブジェクトを参照する命令を含んでいる請求項１５記載のコンピュータ読出し可能な記憶媒体。
【請求項１７】
基準カウントオブジェクトを生成する命令は、オブジェクトに対する最初の基準が形成されたときに実行する請求項１５記載のコンピュータ読出し可能な記憶媒体。
【請求項１８】
オブジェクトにはポインタオブジェクトコンストラクタが含まれており、さらに、オブジェクトの新しいコピーが生成されたとき、ポインタオブジェクトコンストラクタにより基準カウントオブジェクトをインクリメントする命令を含んでいる請求項１５記載のコンピュータ読出し可能な記憶媒体。
【請求項１９】
オブジェクトにはポインタオブジェクトコンストラクタに対する命令が含まれており、さらに、ポインタオブジェクトがその範囲から外れたとき、基準カウントオブジェクトをデクリメントする命令を含んでいる請求項１５記載のコンピュータ読出し可能な記憶媒体。
【請求項２０】
オブジェクトはベースオブジェクトであり、ポインタオブジェクトはベースポインタオブジェクトであり、ベースオブジェクトはポインタオブジェクトコンストラクタを含み、
導出されたオブジェクトをベースオブジェクトから導出する命令と、
この導出されたオブジェクトにキャストされる第２のポインタオブジェクトをキャストする命令と、
第２のポインタオブジェクトを基準カウントオブジェクトに取付ける命令と、
基準カウントオブジェクトをインクリメントする命令とをさらに含んでいる請求項１５記載のコンピュータ読出し可能な記憶媒体。
【請求項２１】
導出されたオブジェクトをデリファレンスする命令と、
第２のポインタオブジェクトを削除する命令と、
基準カウントオブジェクトをデクリメントする命令とをさらに含んでいる請求項２０記載のコンピュータ読出し可能な記憶媒体。
【請求項２２】
ベースオブジェクトをデリファレンスする命令と、
ベースポインタオブジェクトを削除する命令と、
基準カウントオブジェクトを削除する命令とをさらに含んでいる請求項２１記載のコンピュータ読出し可能な記憶媒体。
【請求項２３】
ベースオブジェクトをデリファレンスする命令と、
ベースポインタオブジェクトを削除する命令と、
基準カウントオブジェクトをデクリメントする命令とをさらに含んでいる請求項２０記載のコンピュータ読出し可能な記憶媒体。
【請求項２４】
導出されたオブジェクトをデリファレンスする命令と、
第２のポインタオブジェクトを削除する命令と、
基準カウントオブジェクトを削除する命令とをさらに含んでいる請求項２３記載のコンピュータ読出し可能な記憶媒体。
【請求項２５】
ベースポインタオブジェクトを含むベースオブジェクトを生成する命令と、
基準カウントオブジェクトを生成する命令と、
基準カウントオブジェクトをベースポインタオブジェクトに取付ける命令と、
新しいベースポインタオブジェクトを含むベースオブジェクトから新しいオブジェクトを導出する命令と、
新しいオブジェクトが導出されるたびに基準カウントオブジェクトをインクリメントする命令と、
新しいベースポインタオブジェクトを基準カウントオブジェクトに取付ける命令のステップを含んでいるコンピュータを使用してオブジェクトを管理するためのコンピュータ読出し可能な記憶媒体。
【請求項２６】
ベースオブジェクトを削除し、ベースポインタオブジェクトを基準カウントオブジェクトから切り離す命令と、
基準カウントオブジェクトをデクリメントする命令とをさらに含んでいる請求項２５記載のコンピュータ読出し可能な記憶媒体。
【請求項２７】
新しいオブジェクトを削除し、新しいポインタオブジェクトを基準カウントオブジェクトから切り離す命令と、
基準カウントオブジェクトをデクリメントする命令とをさらに含んでいる請求項２５記載のコンピュータ読出し可能な記憶媒体。
【請求項２８】
ベースオブジェクトを削除し、ベースポインタオブジェクトを基準カウントオブジェクトから切り離す命令と、
基準カウントオブジェクトをデクリメントする命令と、
新しいオブジェクトを削除し、新しいポインタオブジェクトを基準カウントオブジェクトから切り離す命令と、
基準カウントオブジェクトをデクリメントする命令と、
基準カウントオブジェクトを削除する命令とをさらに含んでいる請求項２５記載のコンピュータ読出し可能な記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般に、プログラミング環境における基準オブジェクトに関し、とくに、オブジェクトの管理に関する。
【背景技術】
【０００２】
Ｃ＋＋のようなオブジェクト指向プログラミング言語において発生する２つの共通した問題は、メモリ漏洩およびダングリング（ｄａｎｇｌｉｎｇ）ポインタである。メモリ漏洩は、メモリスペースがオブジェクトに割当てられているが、使用後にそれが解放されないときに発生する。ダングリングポインタは、破壊されたオブジェクトまたはフリーにされたメモリ領域を示す。オブジェクトが動的に破壊された後、ダングリングポインタを使用してその破壊されたオブジェクトの参照しようとする試みは、予測不可能で、しばしば損害の大きい結果を生じさせる可能性が高い。たとえば、破壊されたオブジェクトへの参照が使用された場合、メモリスペースは劣化したものとなり、潜在的にコンピュータプログラムおよび、おそらく、コンピュータ自身をクラッシュさせる可能性が高い。マルチスレッドアプリケーションにおいて、とくに、オブジェクトが“自滅”メソッド（オブジェクトがそれ自身を削除するメソッド）を有しているアプリケーションにおいては、これらの問題はさらに一層顕著になる。
【０００３】
Ｃ＋＋言語は、オブジェクトがランタイムにヒープ上に構成されることを可能にする。これらのオブジェクトは、それらが必要でなくなったときに、生成モジュールまたはある別のモジュールによって削除される必要がある。しかしながら、この明示的オブジェクトの削除は、上述した２つの共通の問題を発生させる可能性が高い。第１に、オブジェクトが削除されなかった場合、これはメモリ漏洩を生じさせ、それによってそのプログラムはメモリを消費すると共に別のアプリケーションからメモリを奪う。第２に、オブジェクトが、ある別のモジュールまたはスレッドがそのオブジェクトに対するポインタを依然保持している最中の早過ぎる時点で削除された場合、これらのポインタが使用されたときにクラッシュが発生する。
【０００４】
既存の解決方法は、基準カウントを維持する機能を提供するためにオブジェクトに依存する。これはオブジェクトに制限を課し、それによって基準カウントポインタは任意の既存のタイプのオブジェクトに対して使用不可能なものになる。図１を参照とすると、典型的な従来技術による解決方法が示されている。実際のオブジェクト102は、ポインタオブジェクト106の基準カウント104を含んでいる。基準カウント104は実際のオブジェクト102によって維持され、管理される。典型的に、共通のクラスから継承する方式で、あるいはそのオブジェクト自身においてスマートポインタを求める（ｓｕｅ）ように以下のコードが各実際のオブジェクトにより構成されなければならない。
【数１】
2004288191.tif 000003
【０００５】
メンバー機能が“この”ポインタを戻す必要がある場合、その構成は、“この”ポインタを戻す前にＡｄｄＲｅｆ（）を呼出さなければならない。たとえば：
【数２】
2004288191.tif 000004
【０００６】
Ｒｅｌｅａｓｅ（）機能には“これを削除する”が存在していることを認識すべきである。これは、いくつかのコンパイラでは合法的ではない。
【発明の開示】
【発明が解決しようとする課題】
【０００７】
これまでの数多くの努力の結果、モジュールおよびスレッドにより保持されるオブジェクト基準のカウントの維持を可能にするポインタオブジェクトが生成されている。これらのポインタオブジェクトはまた最後の基準が解放されたときに、オブジェクトを削除する。しかしながら、これらの努力には２つの主要な欠点がある。第１に、これらのポインタオブジェクトは、そのオブジェクトに構成の制限を課し、オブジェクト自身に強制的に基準カウントを維持させるか、あるいはカウントをベースオブジェクトから継承させる。これによって、ポインタオブジェクトは既存の実際のオブジェクトには使用できないものになる。また、オブジェクト基準をそのオブジェクト内（“この”ポインタ）からハンドアウト（ｈａｎｄ  ｏｕｔ）したとき、基準カウントを手動でインクリメントする必要がある。第２に、これらのポインタは別のオブジェクトポインタにキャストされることができず、したがってポインタの真の特性が失われる。
【０００８】
したがって、オブジェクトの基準カウントをポインタオブジェクト内に維持する自己基準カウントポインタが必要とされている。
【課題を解決するための手段】
【０００９】
上述した必要性を考慮して、本発明は、オブジェクトの基準カウントをポインタオブジェクト内に維持する自己基準カウントポインタを考慮している。本発明は、オブジェクト自身に対して何等制限を課すものではなく、すでに生成されているオブジェクトに関して自由に使用されることが可能である。本発明はまた生のポインタからポインタオブジェクトのルックアップを構成し、“この”ポインタがハンドアウトされたとき、それに正しい基準カウントを維持させる。本発明はまた、正しいオブジェクトタイプに対する基準カウントを失うことなくオブジェクトの非明示的な安全なキャスティングを実行する。
【００１０】
本発明の１つの特徴は、基準カウントオブジェクトを生成し、その基準カウントオブジェクトをオブジェクトのポインタオブジェクトに取付けるステップを含んでいるコンピュータを使用したオブジェクト管理方法にある。通常、生成ステップはそのオブジェクトを参照することによって発生する。基準カウンタは、そのオブジェクトの第１のインスタンスが生成されたとき、通常ではそのオブジェクトに対する最初の基準が形成されたときに生成される。それに続くそのオブジェクトの基準またはコピーが形成されたとき、その基準カウントはインクリメントされ、このオブジェクトの後続的な参照またはコピーに関連付けられたポインタオブジェクトが基準カウントオブジェクトに取付けられる。オブジェクトの任意のインスタンスがその範囲から外れたとき、そのインスタンスに対するポインタオブジェクトはその基準カウントオブジェクトから切り離され、基準カウントがデクリメントされる。基準カウンタに取付けられたオブジェクトのインスタンスが存在しないとき（すなわち、オブジェクトに対する最後の基準がその範囲から外れたとき）、基準カウンタは削除される。
【００１１】
本発明の別の特徴は、ベースポインタオブジェクトを含むベースオブジェクトを生成し、基準カウントオブジェクトを生成し、その基準カウントオブジェクトをベースポインタオブジェクトに取付け、新しいオブジェクトをベースオブジェクトから導出し、そのベースオブジェクトが新しいベースポインタオブジェクトを含み、導出されたオブジェクトの新しいインスタンスが生成されるたびに基準カウントオブジェクトをインクリメントし、新しいベースポインタオブジェクトを基準カウントオブジェクトに取付けるステップを含んでいるコンピュータを使用してオブジェクトを管理する方法にある。ベースオブジェクトが削除されたとき、ベースポインタオブジェクトは基準カウントオブジェクトから切り離され、基準カウントオブジェクトはデクリメントされる。基準カウントオブジェクトに付加されるベースまたは導出されたいずれかの別のオブジェクトが存在する場合、基準カウントオブジェクトは削除されない。新しいオブジェクトが削除されるとき、新しいポインタオブジェクトは基準カウントオブジェクトから切り離され、基準カウントオブジェクトはデクリメントされる。基準カウントオブジェクトに付加されるポインタオブジェクト（ベースタイプおよび導出されたタイプの）がもはや存在しないとき、基準カウントオブジェクトは削除される。
【００１２】
本発明の別の特徴は、上述した方法を行うためにプログラムコードを符号化するためのコンピュータ読出し可能な記憶媒体を含んでいる。
【００１３】
本発明のさらに別の特徴は、本発明の好ましい実施形態が本発明を行うのに最も適した最良モードの１つを単に例示することにより図示され、説明されている以下の説明から当業者に容易に明らかになるであろう。認識されるように、本発明は別の異なった実施形態が可能であり、そのいくつかの詳細は種々の明らかなアスペクトの全てにおいて本発明の技術的範囲を逸脱することなく修正が可能である。したがって、図面および説明は制限を課すものではなく、単なる例示である。
【発明を実施するための最良の形態】
【００１４】
この明細書に組み入れられ、その一部を形成している添付図面は本発明のいくつかの特徴を例示し、その説明と共に本発明の原理を解釈するように機能している。  
好ましい実施形態および示されている例は、この説明において一貫して本発明を限定するものではなく、本発明の例示とみなされなければならない。  
本発明は、基準カウント（オブジェクトを参照するモジュールの数）を維持し、そのオブジェクトを参照するものが何も無いときにそのオブジェクトを削除することにより、Ｃ＋＋ディベロッパがヒープ上に構成されたオブジェクトの全てを正確に追跡を維持する必要性をなくす。ポインタオブジェクトは、ディベロッパが相違に全く気づかずにＣ＋＋ポインタの代りにポインタオブジェクトを使用し続けるように、通常のＣ＋＋ポインタが動作する方式で動作するように設計されている。
【００１５】
本発明は、オブジェクトに対する最初の基準が形成され、それがポインタオブジェクトに付加されたときに直に基準カウントオブジェクトを生成する。ポインタオブジェクトが通常のポインタのようにハンドオーバー（ｈａｎｄ  ｏｖｅｒ）されてコピーされると、基準カウントはポインタオブジェクトコンストラクタによって自動的に更新される。また、ポインタオブジェクトがその範囲から外れたとき、基準カウントはデクリメントされる。最後のポインタオブジェクトがその範囲から外れたとき、実際のオブジェクトは削除される。この時点で、基準カウントオブジェクトもまた削除される。
【００１６】
本発明は、オブジェクトがそれ自身のポインタをハンドアウト（ｈａｎｄｏｕｔ）する（“これを戻す”ように）ことを可能にする。本発明は、基準カウントオブジェクトを生のポインタから調べるメカニズムを提供し、その戻されたポインタオブジェクトに基準カウントオブジェクトを付加すると共に基準カウントを正しくインクリメントする。これによって、基準カウントに注意を払わずにオブジェクトがそれ自身のポインタ（“この”ポインタと呼ばれる）を戻す従来技術の基準カウンタの主要な問題の１つが回避される。リアルオブジェクトに対するコードは、たとえば、
【数３】
2004288191.tif 000005
【００１７】
のような従来技術のものに類似している。
【００１８】
しかしながら、従来技術とは異なり、リアルオブジェクトにはカウンタがなく、カウンタをインクリメントおよびデクリメントするコードもないことを認識すべきである。ポインタオブジェクトは、
【数４】
2004288191.tif 000006
【００１９】
のようなテンプレートとして構成される。また、“この”ポインタを戻すメンバー機能は、基準カウントに注意を払う必要がなく、その構成は、そのポインタが、たとえば、言語ポインタ等の現に存在するリアルオブジェクトであるかのように同じままである。
【数５】
2004288191.tif 000007
【００２０】
したがって、本発明のオブジェクトポインタは、Ｃ＋＋言語ポインタと全く同じように使用されることができ、ユーザが最も適切な時点でオブジェクトを削除する負担を軽減する。
【００２１】
図２を参照とすると、本発明によって検討されているコンポーネントの相互接続を示すブロック図が示されている。実際のオブジェクト102は、ポインタオブジェクト106に接続されている。ポインタオブジェクト106は基準カウンタ104に接続されている。基準カウンタ104は本発明によるポインタオブジェクト106に取付けられ、これによって管理される。
【００２２】
図３を参照とすると、ベースオブジェクトに対するポインタまたは導出されたオブジェクトに対するポインタを使用することによってオブジェクトが実際のオブジェクトから導出されると共にその導出されたオブジェクトのインスタンスが参照されたときのコンポーネントの配置を示すブロック図が示されている。ベース(106)に対するポインタオブジェクトは、オブジェクトに対する最初の基準が基準カウンタ104と共に行われたときに生成される。ポインタオブジェクト106は、基準カウンタ104に取付けられる。導出された実際のオブジェクト102aに対する新しい基準が形成された場合は常に新しいポインタオブジェクト106aもまた生成され、導出されたオブジェクト102aにキャストされる。新しいポインタオブジェクト106aはまた基準カウンタ104に取付けられる。ベースオブジェクト102が生成されるときとは異なり、新しい基準カウンタは生成されないが、しかしその代りに、既に存在する基準カウンタがインクリメントされる。ベースオブジェクト102または新しい実際のオブジェクト102aは関係するポインタオブジェクトに従うので、ポインタオブジェクト106または106aが基準カウンタ104からそれぞれ切り離され、基準カウンタはデクリメントされる。基準カウンタに取付けられるポインタオブジェクトが存在しない場合には常に基準カウンタはそのリアルオブジェクトと共に削除される。
【００２３】
本発明の好ましい実施形態の上述の説明は、例示および説明のために与えられている。網羅的であること、あるいは本発明を開示された厳密な形式に限定することは意図されていない。上記の教示から、明らかな修正または変形が可能である。実施形態は、本発明の原理の最良の例示およびその実用的な適用を示し、それによって当業者が本発明を種々の実施形態の中で、および検討される特定の使用に適した種々の修正を伴って使用することを可能にするために選択され、説明された。このような修正および変形は全て、それらが公平に、法的におよび正当に値すると判断される範囲にしたがって解釈されたとき、添付されている請求の範囲により決定される本発明の技術的範囲内のものである。
【図面の簡単な説明】
【００２４】
【図１】オブジェクトを処理する典型的な従来技術の方法のブロック図。
【図２】本発明によって検討されている実際のオブジェクトとポインタオブジェクトと基準カウンタとの間の関係を示すブロック図。
【図３】本発明によって検討されている多数のオブジェクトに対する実際のオブジェクトとポインタオブジェクトと基準カウンタとの間の関係を示すブロック図。
【図１】
2004288191.tif 000008
【図２】
2004288191.tif 000009
【図３】
2004288191.tif 000010