C++のスマートポインタ(Smart Pointer)とは?自動で安全なメモリ管理を実現しよう!
C++では、new
/ delete
を使って動的メモリを管理しますが、手動で管理するのはミスの元です。
そこで登場するのが「スマートポインタ(Smart Pointer)」です。
スマートポインタを使えば、メモリの確保と解放を自動化し、安全で効率的なプログラムが書けるようになります。
スマートポインタとは?
スマートポインタとは、自動でリソースを解放してくれる賢いポインタです。
C++11以降の標準ライブラリ(<memory>)で使用できます。
主なスマートポインタの種類
種類 | 特徴 |
std::unique_ptr | 所有権をひとつに限定。移動可能。 |
std::shared_ptr | 複数の所有者が共有可能。参照カウントあり。 |
std::weak_ptr | shared_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
の参照カウントを増やしません。
スマートポインタのメリット
- 自動でメモリを解放(delete不要)
- 例外が発生してもリークしない(RAII)
- 安全な所有権の管理ができる
スマートポインタの注意点
unique_ptr
はコピーできない(move
は可能)
shared_ptr
の使いすぎはパフォーマンスに影響
- 循環参照には
weak_ptr
を使う必要あり
まとめ
C++のスマートポインタは、安全なメモリ管理を自動で実現するモダンなツールです。
unique_ptr
、shared_ptr
、weak_ptr
を使い分けることで、手動でのメモリ操作によるバグやリークを防ぐことができます。
まずは unique_ptr
から始めて、make_unique
/ make_shared
で安全な設計を心がけましょう!