2_スマートポインタ
スマートポインタは、C++でメモリ管理を自動化するための便利な機能です。
通常のポインタでは、newでメモリを確保した後、使い終わったら手動でdeleteで解放する必要がありますが、スマートポインタを使うと、自動的にメモリの解放が行われるため、メモリリーク(解放忘れ)を防ぐことができます。
C++には、主に以下の3つのスマートポインタがあります:
-
std::unique_ptr:- メモリの所有権を一つのスマートポインタにだけ持たせ、他の場所で共有しない場合に使います。
- 他の
unique_ptrに所有権を渡すことはできますが、複製はできません。
#include <memory>
int main() {
// スマートポインタを使ってメモリを自動管理
std::unique_ptr<int> p = std::make_unique<int>(10); // int型のメモリを確保し、10を代入
// pがスコープを抜けた時、自動的にメモリが解放される
return 0;
} -
std::shared_ptr:- 複数の場所で同じメモリを共有したい場合に使います。複数の
shared_ptrが同じメモリを指すことができ、最後の1つが破棄されるときにメモリが解放されます。
#include <memory>
int main() {
// shared_ptrでメモリを共有
std::shared_ptr<int> p1 = std::make_shared<int>(10);
std::shared_ptr<int> p2 = p1; // p1とp2は同じメモリを指す
// p1, p2が破棄された時、自動 的にメモリが解放される
return 0;
} - 複数の場所で同じメモリを共有したい場合に使います。複数の
-
std::weak_ptr:shared_ptrの弱い参照です。shared_ptrがメモリを解放するのを防ぎません。循環参照を防ぐために使います。
スマートポインタを使うことで、C++でも手動でdeleteを使う必要がなくなり、メモリ管理が楽になります。また、他の高レベル言語(JavaやC#)のように、自動的にガベージコレクションでメモリを解放する仕組みに近い形で使えます。