●学校情報

講座一覧・募集状況

学習方法

学習サポート

修了生の評価

受講生の横顔

当学院について

入学相談

入学手続

 

●講座情報

技術者養成講座

プログラミング講座

WEB講座

情報処理試験講座

Excel講座

Access講座

 

●関連コラム

関連コラム

関連用語集

 

logo

 

 

関連用語集

C++のスマートポインタ(Smart Pointer)とは?自動で安全なメモリ管理を実現しよう!

C++では、new / delete を使って動的メモリを管理しますが、手動で管理するのはミスの元です。 そこで登場するのが「スマートポインタ(Smart Pointer)」です。 スマートポインタを使えば、メモリの確保と解放を自動化し、安全で効率的なプログラムが書けるようになります。

スマートポインタとは?

スマートポインタとは、自動でリソースを解放してくれる賢いポインタです。 C++11以降の標準ライブラリ(<memory>)で使用できます。

主なスマートポインタの種類

種類特徴
std::unique_ptr所有権をひとつに限定。移動可能。
std::shared_ptr複数の所有者が共有可能。参照カウントあり。
std::weak_ptrshared_ptrを参照するが、所有権は持たない。

unique_ptrの基本的な使い方

#include <iostream>
#include <memory>
using namespace std;

int main() {
    unique_ptr<int> ptr = make_unique<int>(100);
    cout << *ptr << endl;  // → 100
    // delete は不要。スコープを抜けたら自動解放。
    return 0;
}

make_unique を使えば、より安全にメモリ確保ができます。

shared_ptrの基本的な使い方

#include <iostream>
#include <memory>
using namespace std;

int main() {
    shared_ptr<int> p1 = make_shared<int>(200);
    shared_ptr<int> p2 = p1;  // 所有権を共有

    cout << *p1 << ", " << *p2 << endl;
    cout << "参照カウント: " << p1.use_count() << endl;  // → 2
    return 0;
}

shared_ptr は複数の場所で同じリソースを共有するのに便利です。

weak_ptrで循環参照を防ぐ

shared_ptr 同士が互いに参照し合うと、メモリが解放されない「循環参照」が起きる可能性があります。 これを防ぐために weak_ptr を使います。

#include <memory>

struct Node {
    shared_ptr<Node> next;
    weak_ptr<Node> prev;
};

weak_ptr は所有権を持たないため、shared_ptr の参照カウントを増やしません。

スマートポインタのメリット

  1. 自動でメモリを解放(delete不要)
  2. 例外が発生してもリークしない(RAII)
  3. 安全な所有権の管理ができる

スマートポインタの注意点

  • unique_ptr はコピーできない(moveは可能)
  • shared_ptr の使いすぎはパフォーマンスに影響
  • 循環参照には weak_ptr を使う必要あり

まとめ

C++のスマートポインタは、安全なメモリ管理を自動で実現するモダンなツールです。 unique_ptrshared_ptrweak_ptr を使い分けることで、手動でのメモリ操作によるバグやリークを防ぐことができます。

まずは unique_ptr から始めて、make_unique / make_shared で安全な設計を心がけましょう!

 

C++関連用語集

−−−−−  C++  −−−−−

C++のクラス(Class)とは?仕組みと使い方をわかりやすく解説!

C++のオブジェクト(Object)とは?クラスとの関係と役割をわかりやすく解説!

C++のコンストラクタ(Constructor)とは?役割と使い方をやさしく解説!

C++のデストラクタ(Destructor)とは?役割と使い方をやさしく解説!

C++の継承(Inheritance)とは?クラスを拡張する基本テクニック

C++の多態性/ポリモーフィズム(Polymorphism)とは?オブジェクト指向の真髄を解説!

C++のオーバーロード(Overload)とは?関数や演算子を便利に使い分けよう!

C++のオーバーライド(Override)とは?継承と仮想関数の正しい使い方

C++の仮想関数(Virtual Function)とは?ポリモーフィズムを実現する仕組みを解説!

C++の純粋仮想関数(Pure Virtual Function)とは?抽象クラスとの関係も解説!

C++の抽象クラス(Abstract Class)とは?使い方と役割をわかりやすく解説!

C++のテンプレート(Template)とは?型に依存しない汎用的な関数・クラスを作ろう!

C++の名前空間(Namespace)とは?名前の衝突を防ぐ便利な機能

C++の標準テンプレートライブラリ(STL)とは?効率的な開発に必須のライブラリ群

C++のベクター(vector)とは?配列より便利なSTLコンテナを使いこなそう!

C++のイテレータ(Iterator)とは?STLコンテナを自在に操作する鍵

C++の参照(Reference)とは?ポインタとの違いもわかりやすく解説!

C++のポインタ(Pointer)とは?メモリを操る強力な機能をやさしく解説!

C++の動的メモリ確保(Dynamic Memory Allocation)とは?newとdeleteを使いこなそう

C++のnew/delete演算子とは?動的メモリ確保の基本をマスターしよう!

C++の例外処理(Exception Handling)とは?try/catch/throwでエラーに強いプログラムを作ろう

C++のtry/catch構文とは?例外処理の基本をやさしく解説!

C++のRAIIとは?リソース管理を自動化する重要な設計原則

C++の静的変数(static variable)とは?使い方・特徴・注意点をやさしく解説!

C++の関数ポインタ(Function Pointer)とは?使い方と活用例をわかりやすく解説!

C++のラムダ式(Lambda Expression)とは?書き方・使い方をやさしく解説!

C++のスマートポインタ(Smart Pointer)とは?自動で安全なメモリ管理を実現しよう!

C++のコンパイル(Compile)とは?仕組みと流れをわかりやすく解説!

C++のリンク(Link)とは?コンパイルとの違いとエラー対策を解説!

C++のプリプロセッサディレクティブとは?#include や #define の意味と使い方