スマートポインターが生のnewとdeleteを置き換える理由
RAIIを理解し、現代のC++で所有権を持つ生ポインターがほとんど適切でない理由を学びます。
「スマートポインターが生のnewとdeleteを置き換える理由」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
newとdeleteの直接使用
Cから受け継いだ仕組みでは、new Tがヒープ上にTを確保し、deleteが解放します。すべてのnewに対して必ず1回だけdeleteを対応させる必要があります。そうしないと、メモリリークやクラッシュが発生します。
Widget* w = new Widget();
// ... use w ...
delete w; // forget this and you leak何が問題になるか
よくある失敗は次のとおりです。
deleteの呼び忘れ — メモリリークdeleteの二重実行 — 未定義動作newとdeleteの間で例外が発生 — メモリリーク- 所有権が不明確な生ポインターの返却
RAIIによる解決
Resource Acquisition Is Initializationとは、リソースの有効期間をスタックオブジェクトの有効期間に結び付ける考え方です。デストラクターがリソースを解放するため、例外が発生しても安全です。
スマートポインターの考え方
スマートポインターは、生ポインターを包む小さなRAIIラッパーです。デストラクターがdeleteを呼び出すため、解放を忘れることがありません。
3種類のスマートポインター
<memory>で提供される標準ライブラリのスマートポインターは次のとおりです。
std::unique_ptr<T>— 排他的な所有権std::shared_ptr<T>— 参照カウントによる共有所有権std::weak_ptr<T>— shared_ptrを所有せずに監視するポインター
スマートポインターは軽量です
unique_ptrにはオーバーヘッドがなく、生ポインターと同じサイズ・速度です。shared_ptrには、参照カウントのための小さなアトミック操作コストがあります。
手動でdeleteする必要はありません
スマートポインターを使えば、deleteを自分で書くことはほとんどありません。デストラクターが処理してくれます。
#include <memory>
std::unique_ptr<Widget> w = std::make_unique<Widget>();
// no delete needed — when w goes out of scope, Widget is destroyedスマートポインターと例外
関数の途中で例外が発生すると、ローカル変数は逆順に破棄されます。スマートポインターは自動的にリソースを解放しますが、生ポインターではメモリリークが発生します。
型で表現される所有権
スマートポインターの型が所有権を表現するようになります。関数シグネチャを読むだけで、オブジェクトの所有者が分かります。
// I take ownership
void consume(std::unique_ptr<Widget> w);
// I look but do not own
void inspect(const Widget& w);生ポインターも存在します
所有権を持たないアクセスには、生ポインター(または参照)を使います。「所有するのではなく借用する」という意図を伝えられます。
newをmake関数に置き換える
std::make_unique(C++14)とstd::make_shared(C++11)を優先してください。例外に対して安全で、newを直接呼び出すより少し効率的です。
auto w = std::make_unique<Widget>(42);
auto s = std::make_shared<Resource>("file.txt");クイックチェック
生のnew/deleteの組み合わせではなくstd::unique_ptrを使う主な理由は何ですか。
まとめ
生のnew/deleteはエラーが起きやすい方法です。スマートポインターはヒープ上に確保したオブジェクトをRAIIハンドルで包み、自動的に解放します。安全性と性能のため、std::make_uniqueとstd::make_sharedを優先してください。
よくある質問
「スマートポインターが生のnewとdeleteを置き換える理由」レッスンは無料ですか?
はい。「スマートポインターが生のnewとdeleteを置き換える理由」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「スマートポインターが生のnewとdeleteを置き換える理由」で何を学びますか?
RAIIを理解し、現代のC++で所有権を持つ生ポインターがほとんど適切でない理由を学びます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「スマートポインターが生のnewとdeleteを置き換える理由」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- スマートポインターが生のnewとdeleteを置き換える理由
- unique_ptrによる単独所有
- shared_ptrとweak_ptrによる共有所有
- カスタムデリーターとmake関数