オブジェクトとポインタ

オブジェクトとポインタ

 C++のようにC言語風の構文を持つオブジェクト指向言語はいくつかあります。C言語にオブジェクト指向の機能を導入した言語としては、Mac OS XやiPhoneのアプリケーション記述言語であるObjective-Cがあります。JavaとC#はともにC++のよい点を取り入れて設計された言語と言われています。さて、これらの言語で、オブジェクトとポインタがどのように扱われているかを見てみます(図2)。

 前ページの例で示したように、C++ではインスタンスオブジェクトは構造体のようにその実体が変数に格納されていても、メモリ上のどこか(ヒープ領域)にあってそれをポインタで参照していてもよいことになっています。structという予約語のほかにclassという新しい予約語でクラス定義を記述することができますが、どちらを使ってもインスタンスの扱いは同じです。

 Objective-Cの場合、インスタンスはヒープ領域に動的に確保する方法しかありません。構造体はC言語と同じように扱えますが、Objective-Cではstructはオブジェクトを定義する方法ではありません。

 C#はstructとclassを持っていますが、structはスタック上の自動変数にインスタンスの実体を作成することができます。classを使った場合はインスタンスはヒープにとられます。

 Javaの場合、structは存在せず、インスタンスはヒープにとられます。

 Javaにはポインタがない、というキャッチフレーズを聞いたことがあるかもしれません。Javaではインスタンスはヒープに作成されますので、ヒープのアドレスを参照しているという意味ではポインタは使っています。しかし、ヒープに作成される以外の形態のインスタンスがないため、「ポインタで指されたオブジェクト」ということを意識することはありません。

 また、C言語などでは、T型のデータがあれば派生型として*T型(T型を指すポインタ型)が自動的に存在する言語仕様になっていますが、Javaにはそのような意味でのポインタや、さらにポインタ演算もありません。そのような意味においては、Javaにはポインタはないと言えます。

インスタンスの生成と解放

 C++、Java、C#では、インスタンスオブジェクトを初期設定するための手続きをコンストラクタと呼び、通常のメンバ関数とは違う扱いをします。ほかの言語でも通常のメソッドとは扱いが異なる場合が多く、イニシャライザと呼ばれることもあります。

 一方、インスタンスを解放する時に実行される手続きを同様にデストラクタと呼びます。ほかの言語ではファイナライザと呼ばれることもあります。

 インスタンスオブジェクトはプログラムの実行に伴って動的に次々に作られていきますが、一方で、役目が終わったインスタンスはきちんと解放して再利用できるようにしなければなりません。このために、JavaやC#をはじめ、最近設計された多くの言語にはガーベジコレクション、つまり「ごみ集め」の機能があります。使われなくなったメモリ領域を自動的に解放してくれるので、メモリリーク(メモリの解放し忘れ)がほとんどなくなり、プログラミングも容易になります。

 一方、ガーベジコレクションは実行効率を低下させる要因になりますので、C++には今のところ、言語仕様の上でガーベジコレクションの機能はありません。スタック上や静的変数にインスタンスが存在することを許していることもその理由だと考えられます。

 Objective-Cは、生成したインスタンスをリファレンスカウンター方式で管理しています。あるオブジェクトが何カ所から参照されているかをプログラマの責任で管理する方式で、実装は容易で実行も高速ですがメモリリークが起きやすいという欠点があります。新しい言語仕様(Objective-C 2.0)ではガーベジコレクションも利用できるようになっていますが、リファレンスカウンター方式とガーベジコレクションの併用はできません。また、現時点では iPhone上でガーベジコレクションは利用できません。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30