MeWrite Docs

C++: Segmentation fault (core dumped)

C++で不正なメモリアクセスが発生した場合のエラー

概要

C++プログラムが許可されていないメモリ領域にアクセスしようとした場合に発生するエラーです。

エラーメッセージ

Segmentation fault (core dumped)

または

Signal: SIGSEGV (Segmentation fault)

原因

  1. NULLポインタの参照: 初期化されていないポインタの使用
  2. 解放済みメモリへのアクセス: deleteした後のポインタ使用
  3. 配列の範囲外アクセス: インデックスが配列サイズを超えている
  4. スタックオーバーフロー: 再帰が深すぎる、または大きなローカル変数

解決策

1. ポインタの初期化を確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 悪い例
int* ptr;
*ptr = 10;  // 未初期化ポインタ

// 良い例
int* ptr = nullptr;
if (ptr != nullptr) {
    *ptr = 10;
}

// またはスマートポインタを使用
std::unique_ptr<int> ptr = std::make_unique<int>(10);

2. 配列の範囲チェック

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 悪い例
int arr[5];
arr[10] = 100;  // 範囲外アクセス

// 良い例:std::vectorを使用
std::vector<int> vec(5);
try {
    vec.at(10) = 100;  // 例外をスロー
} catch (const std::out_of_range& e) {
    std::cerr << "範囲外アクセス: " << e.what() << std::endl;
}

3. スマートポインタを使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <memory>

// 悪い例:生ポインタ
int* ptr = new int(42);
delete ptr;
*ptr = 10;  // ダングリングポインタ

// 良い例:スマートポインタ
std::unique_ptr<int> ptr = std::make_unique<int>(42);
// 自動的に解放される

4. デバッガで調査

1
2
3
4
5
6
7
8
9
# コアダンプを有効化
ulimit -c unlimited

# プログラムを実行(クラッシュ後にcoreファイル生成)
./my_program

# gdbで解析
gdb ./my_program core
(gdb) bt  # バックトレースを表示

5. AddressSanitizer を使用

1
2
3
4
5
# コンパイル時にASanを有効化
g++ -fsanitize=address -g -o my_program my_program.cpp

# 実行(詳細なエラー情報が表示される)
./my_program

6. valgrind で検出

1
valgrind --leak-check=full ./my_program

7. 再帰の深さを確認

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 悪い例:無限再帰
void infinite() {
    infinite();  // スタックオーバーフロー
}

// 良い例:終了条件を設定
void countdown(int n) {
    if (n <= 0) return;  // 終了条件
    countdown(n - 1);
}

よくある間違い

  • deleteした後のポインタをnullptrに設定していない
  • std::vectorの[]演算子で範囲チェックなしにアクセス
  • C文字列のnull終端を忘れている
  • マルチスレッドでの競合状態

C++ の他のエラー

最終更新: 2025-12-09