0Pricing
C++ Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 生ポインターとアドレス演算子
  2. デリファレンスとポインター演算
  3. nullptrとnullポインターの安全性
  4. ポインターと参照の使い分け
← C++ Academyに戻る