---
title: RAIIと所有権の話
tags: 
author: [zbdk](https://www.docswell.com/user/zbdk)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/8EDKR6367G.jpg?width=480
description: C++ breaktime 2026/Summerの発表資料です。 https://cpp-osaka.connpass.com/event/393713/
published: June 20, 26
canonical: https://www.docswell.com/s/zbdk/5JWQJV-2026-06-20-120818
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/8EDKR6367G.jpg)

RAIIと所有権の話
@zbdk


# Page. 2

![Page Image](https://bcdn.docswell.com/page/V7PKWYPZJ8.jpg)

おことわり
■ この発表は知っている人から見ると当たり前の話です
■ あえて触れていない部分があります
– 左辺値、右辺値
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/2JVV8G2MJQ.jpg)

いきなりですが
■ C++を書いていて以下の経験をしたことがある人
– メモリリークさせたことがある
– 二重解放させたことがある
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/5EGL58RXJL.jpg)

メモリリーク
■ 確保したメモリを解放せずに手放すこと
■ メモリが枯渇してストップの原因に
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/4JQYZ9V57P.jpg)

二重解放
■ すでに解放済みのリソースを再度解放してしまうこと
■ ストップなどの未定義動作に
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/K74W3XMVE1.jpg)

そんなことしないって1
■ 本当に?
deleteが呼び出されない
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/LJ1Y1N84EG.jpg)

そんなことしないって2
■ 本当に??
structA
MyClass
structB
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/GJWG84ZZ72.jpg)

今日のテーマ
■ メモリリークや二重解放をしないための仕組み
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/4EZL821L73.jpg)

メモリリーク対策
■ RAIIを使ってメモリ管理を行う
■ RAII
– オブジェクト生成(コンストラクタ)時に
リソースを確保
– オブジェクト破棄(デストラクタ)時に
リソースを解放
■ RAIIの例
– scope_exit
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/Y76WPVLM7V.jpg)

scope_exit (1/2)
■ 関数を登録しておき
scopeが終わる際に
登録した関数を
実行できるライブラリ
■ 良いお知らせ
– 標準ライブラリと
して提案中
deleteが呼び出される
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/G75MKD1Q74.jpg)

scope_exit (2/2)
■ 悪いお知らせ
– 未だに採択されない
– 2013年から議論中
(N3677)
■ 実験的に実装されてはいる
– std::experimental::scope_exit
– GCCやClangだと使えるかも
– VisualStudio2022では使えませんでした・・・
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/9J29W81WER.jpg)

RAIIクラス
■ じゃあ標準でメモリに関するRAIIクラスは
用意されてないの?
■ あります
– std::unique_ptr
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/DEY4L6Z9JM.jpg)

std::unique_ptr(C++11～)
■ scopeが終わったタイミングでメモリ破棄を行いだけで
あればstd::unique_ptrが利用可能
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/VJNY4Z3D78.jpg)

何がユニークなの?
■ そのリソースの所有権を唯一持っている点でユニーク
■ コピーができない
– できてしまうとコピー元とコピー先で同じリソースを
指すポインタを持つことになってしまう(非ユニーク)
ptr1
ptr2
MyClass
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/YE9PQZ98J3.jpg)

所有権の移動
■ じゃあリソースはunique_ptrと心中するしかない?
– std::moveを使うことで所有権の移譲が可能
– move先にポインタが移動し、move元は何も所有しな
い状態になる
ptr1
ptr2
MyClass
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/GE8DG19ZED.jpg)

std::unique_ptrのメリット
■ unique_ptrの寿命が尽きた際、自動的にdeleteしてくれる
– 自分でdeleteを書かないので解放漏れ、二重解放のリ
スクが低くなる
■ 誰が所有しているのかが明確になる
– 生ポインタだと所有と参照の違いがわからず、
new/deleteしているかで判断する必要がある
– unique_ptrだと実際の処理を確認しなくても
ヘッダの記述だけで所有がわかる
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/LELMGQW17R.jpg)

std::unique_ptrのデメリット?
■ オーバーヘッドが生じるので処理速度に影響があるかも
■ プログラミングにおいては「かもしれない運転」よりも
実際に計測してみる方が大事
■ 生成AIにベンチマークプログラムを書いてもらった
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/4JMYQ195JW.jpg)

生成・破棄の計測
■ どれも50ns程度の実行コストで変わらない
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/PJR98LGZ79.jpg)

間接参照の計測
■ rawとsmartの差はなく、先ほど(50ns)より速い
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/PEXQ8WX1JX.jpg)

その他の計測まとめ
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/3EK9KVWMED.jpg)

まとめ
■ メモリの確保解放はRAIIクラスにまかせよう
– メモリリークや二重解放を防げる
■ exit_scopeはスコープ終了時の処理を登録できるクラス
– リソースの解放処理を書いておける
– 標準化はされていないがリファレンス実装がある
■ std::unique_ptrはそのメモリを唯一所有するクラス
– std::moveで所有権を移譲できる
– 低オーバーヘッド
21


