プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • C++
  • 【C++】クラスのオブジェクト構築や、メモリの概念、スマートポインタ、参照ポインタ
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【C++】クラスのオブジェクト構築や、メモリの概念、スマートポインタ、参照ポインタ

03.09

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

C++でも、クラスやオブジェクトをもちろん扱うことができますが、その前にメモリの概念を押さえておく必要があります。

C++におけるメモリの概念

  • 自動メモリ
  • フリーストア

自動メモリ

オブジェクトが自動的に管理されるメモリです。サイズは小さいです。VC++で1MB程度です。スタックメモリ領域を使います。

特に明示的に開放しなくても、ブロックの終わりで解放されます。(例えば、main関数の完了時に解放されます。)

フリーストア

オブジェクトをプログラマが管理するメモリ領域。ヒープメモリ領域に格納されます。「動的メモリ」とも呼ばれます。

特徴としては、自動メモリ領域よりも大きいです。

クラスのオブジェクトを宣言する構文

ポインタを使わない場合

オブジェクトは「自動メモリ」に配置されます。

新規作成

1
2
3
型 変数名
または
型 変数名{}

すでにあるオブジェクトをコピーして作成する場合

1
2
3
4
5
型 変数名(同型のオブジェクト)
または
型 変数名{同型のオブジェクト}
または
型 変数名 = 同型のオブジェクト

ポインタ(new)を使う場合

オブジェクトは「フリーストア」に配置されます。

新規作成

1
2
3
4
5
型* ポインタ変数名 = new 型
または
型* ポインタ変数名 = new 型{}
または
型* ポインタ変数名 = new 型()

ポインタ変数からオブジェクトにアクセスするには下記の構文を使います。

1
*ポインタ変数名

すでにあるオブジェクトをコピーして作成する場合

ポインタを使う場合でもコピーは可能です。

1
2
3
型* ポインタ変数名 = new 型(同型のオブジェクト)
または
型* ポインタ変数名 = new 型{同型のオブジェクト}

オブジェクトの解体

「フリーストア」に配置されたオブジェクトはブロックの終わりで解体されません。

プログラマが明示的に開放してあげる必要があります。

下記の構文を使って、定義したポインタ変数を解放してあげましょう。

1
delete ポインタ変数名;

解放し忘れると、フリーストア内に使われないオブジェクトが放置されてメモリリークの原因になるので注意です。

「自動メモリ」と「フリーストア」でどのように使い分ければよいのか?

では、オブジェクト作成はどちらの宣言もできますが、どのように使い分ければよいのでしょうか。

メモリの管理が面倒なので、基本的には自動メモリ(newを使わない方)を使うようにしましょう。

ただ、自動メモリは小さいので、入りきらないような大きなオブジェクトを構築する場合は、ポインタ変数を使ったフリーストアにオブジェクトを構築するようにしましょう。

ただ、フリーストア領域のメモリ管理は面倒ですし、危険ですよね。そのために用意されたC++の機能である「スマートポインタ」というものがあります。

スマートポインタとは?

動的に管理するのは非常に面倒です。そこで用意された仕組みが「スマートポインタ」になります。

スマートポインタで管理されるオブジェクトは自動的に管理されるため、明示的にdeleteを使わなくても自動開放されます。

スマートポインタが定義されているヘッダ

<memory>で定義されており、下記の二種類があります。

  • std::unique_ptr
  • std::shared_ptr

std::unique_ptr

コチラの方が早い。

std::shared_ptr

コチラの方が簡単に扱うことができる。

参照ポインタとは?

C言語にはない機能で、関数の引数にポインタを渡す場合に使うことができる機能です。

通常のポインタであれば、下記のような関数を宣言した場合は、

1
void func(int* a);

下記のように渡す必要があります。

1
2
int a;
func(&a);

ただ、「参照ポインタ」を利用した場合は、「*」の代わりに「&」を利用します。

1
void func(int& a);

渡す際に「&」を記述する必要がなくなります。

1
2
int a;
func(a);

スポンサーリンク
  • 2019 03.09
  • miyabisan2
  • コメントを書く
  • C++
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2019 03.06

    【C++】「名前空間」、「変数(型推論なども)」、「クラス」、「関数」、「仮想関数」、「関数テンプレート」、「入出力演算子」

  2. 2019 05.19

    【VB.NET】VB.NETからC++のDLLを呼び出す方法

  3. 2019 03.10

    【C++】「ライブラリ(スタティックライブラリ、DDL)」、STL(標準テンプレートライブラリ)など

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【C言語】「ビルド」作業の知識と効率化について(mak…

【C++】「ライブラリ(スタティックライブラリ、DDL…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • AngularJS
  • API
  • AWS
  • C++
  • CSS
  • cursor
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Figma
  • Git
  • GitLab
  • GraphQL
  • gRPC
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 生成AI
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー