nullptrとnullポインターの安全性
NULLや0の代わりにnullptrを使い、nullのデリファレンスを防ぎます。
「nullptrとnullポインターの安全性」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
ヌルポインターとは
ヌルポインターは「何もない」ことを示す特殊な値です。デリファレンスすると未定義動作になり、通常はセグメンテーションフォールトが発生してクラッシュします。
現代のC++におけるnullptr
C++11以降、キーワードnullptrは型付きのヌルポインターリテラルを表します。NULLや0よりもこちらを優先してください。
int* p1 = nullptr;
int* p2 = NULL; // legacy macro
int* p3 = 0; // legacy literalなぜnullptrなのか
NULLは単なる0のマクロです。そのため、intとint*の間のオーバーロード解決で混乱が生じることがあります。nullptrは固有の型std::nullptr_tを持ちます。
void f(int);
void f(int*);
f(NULL); // calls f(int) -- surprising!
f(nullptr); // calls f(int*) -- correctヌルかどうかを確認する
ポインターは暗黙的にboolへ変換されます。nullでなければtrue、nullならfalseです。
if (p) std::cout << "has value\n";
if (!p) std::cout << "is null\n";
if (p != nullptr) std::cout << "explicit form\n";必ず初期化する
初期化されていないポインターには不定な値が入り、どこかを指しているかのように見えます。nullptrを設定するだけでもよいので、必ず初期化してください。
int* p; // BAD: undefined contents
int* q = nullptr; // GOODヌルポインターのデリファレンス
ヌルポインター経由で読み書きすると未定義動作になります。ほとんどのデスクトップシステムではセグメンテーションフォールトが発生しますが、組み込みデバイスではメモリが静かに破壊されることがあります。
防御的なチェック
公開APIでは、または呼び出し元がnullを渡す可能性がある場合は、デリファレンスする前に確認してください。
void process(int* data) {
if (!data) return;
*data *= 2;
}ポインターの代わりに参照を使う
nullが意味を持たない場合は、参照パラメーターを使ってください。コンパイラーによって、参照が何らかの対象に束縛されることが保証されます。
// Before
void f(Widget* w); // can be null?
// After
void f(Widget& w); // must be a real widgetオプショナル値にはstd::optional
C++17では、「値が存在するかもしれない」という意味を表すstd::optional<T>が追加されました。メモリ確保を伴わない場面では、null許容ポインターよりも意図が明確です。
#include <optional>
std::optional<int> find(int x);
if (auto v = find(42)) std::cout << *v;スマートポインターとnull
std::unique_ptrとstd::shared_ptrもnullになり得ます。チェック時にはboolに変換でき、= nullptrでリセットできます。
落とし穴:delete後のダングリング
delete pの後も、ポインターには古いアドレスが残っています。p = nullptr;でリセットしてください。スマートポインターなら自動的に行われます。
クイックチェック
現代のC++では、どのヌルポインターリテラルを使うべきですか?
まとめ
ヌルポインター値にはnullptrを使ってください。ポインターは必ず初期化してください。デリファレンスする前に確認するか、nullが有効でない場合は、より適切な参照やstd::optionalを使ってください。
よくある質問
「nullptrとnullポインターの安全性」レッスンは無料ですか?
はい。「nullptrとnullポインターの安全性」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「nullptrとnullポインターの安全性」で何を学びますか?
NULLや0の代わりにnullptrを使い、nullのデリファレンスを防ぎます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「nullptrとnullポインターの安全性」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 生ポインターとアドレス演算子
- デリファレンスとポインター演算
- nullptrとnullポインターの安全性
- ポインターと参照の使い分け