1. はじめに
ChatGTPは非常に優秀で、ちょっとした質問であればググるよりも簡単に調べることができる。そこで、疑問点をChatGTPに質問し、教えてもらった内容をまとめてみようと思う。ただし、厳密な裏どりができてないので、見る人は注意すること。
今回は、スマートポインタについて取り上げる。
2. スマートポインタとは何か?
スマートポインタとは何か調べるために、下記の質問を行った。
スマートポインタは、通常のポインタよりも高度な機能を持ったポインタである。特に、メモリの確保・解放を自動的に行えるようだ。
3. メリットとデメリット
スマートポインタのメリット・デメリットをまとめる。
3.1 通常のポインタとスマートポインタの比較
通常のポインタとスマートポインタを比較し、メリット・デメリットを確認する。
上記から、スマートポインタは通常のポインタと比較すると、通常のポインタで課題であったメモリ管理を意識する必要がなくなり、安全性の高いコードが書けることがわかる。逆にデメリットとしては、オーバーヘッドが増えるため、処理時間が気になる場合は注意が必要だ。
また、通常のポインタのことを生ポインタと呼ぶらしい。おそらく、(Raw Pointer)から来ていると思われる。
3.2 メモリリークとは
メモリリークという用語が出てきたため、念の為整理する。
メモリリークとは、動的に確保したメモリを解放しないことで、使用できる領域を食い潰す現象である。その場合、プログラムの動作が遅くなったり、異常終了するという現象を引き起こす。
ChatGPTは追加でメモリリークの例を提示してきた。
int main() {
int* leakyMemory = new int[100];
return 0;
}
上記は、new演算子で変数leakMemoryをメモリを動的確保している。メモリ解放をするならば、deleteして解放する必要があるがしていない。これがメモリリークである。なお、プログラムが終了すれば、メモリは解放されるため、この例は不適切である。
4. 生ポインタとスマートポインタの比較結果の整理
比較結果から、スマートポインタの主要なメリット・デメリットを整理する。
メリット:
・メモリの確保・解放を意識する必要がないため、メモリリークを防げる。
デメリット:
・オーバーヘッドが生ポインタよりも大きいため、処理時間が求められるソフトには不向きである。
他にもChatGPTはまとめてくれたが、筆者はここが主要なメリット・デメリットと解釈した。
5. スマートポインタの種類
5.1 スマートポインタの種類の整理
スマートポインタには色々なものがある。次に、どのような種類があるのか聞いてみる。
スマートポインタは、unique_ptr、shared_ptr、weak_ptrの3つあることがわかった。ただし、筆者には、「所有権」「参照カウント」という用語がわからず、説明を理解することができていない。
5.2 所有権
所有権について聞いてみる。
この説明ではあまりわからないが、おそらく、ポインタの管理者が誰かを示したものを所有権というようだ。プログラムの例も示していたが、一旦おいておく。
5.3 参照カウントとは
参照カウントについても聞いてみる。
参照カウントとは、スマートポインタの所有権の数を管理する仕組みのようだ。
6. まとめ
今回調べた内容を下記にまとめる。
・スマートポインタとは、高機能なポインタである。
・メリットは、メモリ管理(確保・解放)を自動的に行うことができる。
・デメリットは、生ポインタと比べてオーバーヘッドがある
・C++のスマートポインタには、unique_ptr、shared_ptr、week_ptrの3種類がある。
・所有権とは、ポインタの管理者が誰かを示したもののことを言う。
・参照カウントとは、管理しているスマートポインタの数のことである。