カッティングボード

カルマをカットしてます

C++のポインタとスマートポインタ

 シューティングゲームをサークルで作っていたら、自分の担当箇所が原因でメモリリークを起こしてしまったので、今まで逃げに逃げていたポインタとスマートポインタについて調べました。案外調べてみたら理解できたような気がしたので自分なりにまとめてみます。

 

 前提知識としてメモリ以外のインスタンスだったりメモリリークだったりの基本用語は分かることとします。また、メモリ領域を確保するものとしてインスタンスの生成以外にもありますが今回はそれらを無視します。

 

 いきなりですが、あなたは探偵社を経営しているとします。あなたの探偵社には100万円まで探偵を雇う資金があります。(この資金がメモリで探偵がインスタンス。)

 当たり前のことですが、あなたは資金以上に探偵を雇うと破産してしまいます。(メモリの容量以上にメモリ領域を確保しようとするとメモリリークを起こす。)

 そのため、その資金内で自分の探偵社に必要な探偵を雇わなければいけません。(メモリの容量内で必要な機能を持つクラスのインスタンスを生成しなければいけない。)

 最初のうちは、依頼者が来た時にいちいち探偵自身を呼んで依頼者の対応を行っていました。(変数にインスタンスを格納している。)

 しかし、依頼者が来るたびにその依頼者に会った探偵をいちいち呼ぶのが大変なので探偵の連絡先を依頼者に渡すことで依頼者と探偵でやり取りを行ってもらうことにしました。(変数にインスタンスを格納すると重いのでインスタンスのアドレスだけ格納している。つまりポインタを利用することにした。)

 日が経つにつれて、依頼者のニーズが変わり今まで使っていた探偵がいらなくなってしまいました。(変数のスコープが外れたり、変数に違う値が格納された。)

 あなたは資金に限度があるためいらなくなった探偵を解雇することにしました。(deleteを行うことでメモリの開放をする。)

 

 ここまでがポインタを利用し、自分でメモリ領域を確保したり開放することでメモリリークを防ぐ方法です。次からはスマートポインタを利用する方法です。

 

 あなたの探偵社は軌道に乗り多くの探偵を雇うことになりました。(コード量が多くなり大量のインスタンス持っている。)

 しかし、探偵を多く雇うにつれ依頼者のニーズに合わせた探偵の管理が仕切れなくなり始めました。(コード量が多くなりどこでスコープが外れるのか、変数に違う値が格納されるのかを把握しきれなくなった。)

 そこで依頼者のニーズに合わせた探偵の管理をしてくれる仲介業社を雇うことにしました。(スマートポインタの導入。)

 仲介業社は依頼者のニーズを調査しニーズがなくなった探偵を勝手に解雇してくれます。(変数のスコープが外れたり、変数に違う値が代入された時に、自分でdeleteを行わなくてもスマートポインタがメモリの開放を行ってくれる。)

 これで、あなたは資金を基本的に気にすることなく依頼者のニーズにあった探偵を採用しスムーズに探偵社を運営することができるようになりました。(メモリリークを気にせずにインスタンスを生成できるようになる。もちろん同スコープ内でメモリ容量以上の容量になるインスタンスの生成を行えばメモリリークは起きる。)

 

 かなりガバガバですが自分はこんな感覚でポインタとスマートポインタを理解しています。違う部分とかあればまさかりを投げていただけると助かります。これでポインタとスマートポインタを理解したとドヤ顔をすると詳しい方に殺されるので自分でもしっかり調べてください。