最終更新日時: 2026年06月15日 14時22分22秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<cstdlib>

# std::realloc

    namespace std {
      void* realloc(void* ptr, size_t new_size);
    }

## 概要

確保済みの領域`ptr`を`new_size`に再確保する。

`ptr`は、`calloc`、`malloc`、`realloc`で事前に確保され、なおかつ`free`で解放されていないメモリである必要がある。

それ以外のメモリの場合、動作は未定義。

`ptr`に`nullptr`を渡した場合、`malloc(new_size)`として動作する。

## 効果

メモリの確保は次のいずれかの方法で行われる。

- 既存のメモリを拡張、縮小する。
  - 縮小した場合、再確保されたメモリのサイズまでの領域の内容が保持される。
  - 拡張した場合、新しい領域の内容は未規定。
- 新しいサイズの領域を確保、割り当てする。その後、新しいサイズと古いサイズのいずれか小さい方のサイズに等しいメモリ領域をコピーし、古いブロックを解放する。
- メモリが不足している場合、`nullptr`が返される。

## 戻り値

再確保できた場合、その領域の先頭のポインタを返す。

失敗した場合、`nullptr`を返す。もとのポインタは有効なままで、解放する必要がある。

## 備考

- `new_size`が0の場合の動作は以下となる。
  - C++23まで : 未規定
  - C++26 : エラー性動作 (erroneous behavior)となる。その効果は処理系定義であり、POSIXの動作も許容される
- 確保された領域はメモリリークを避けるため、`free`、`realloc`で解放する必要がある。

## 例

    #include <cstdlib>
    #include <iostream>

    int main() {
      // 初期サイズでメモリを確保
      int* p = static_cast<int*>(std::malloc(5 * sizeof(int)));
      if (!p) return 1;
      for (int i = 0; i < 5; ++i) {
        p[i] = i;
      }
      // サイズを再確保（拡張）
      int* q = static_cast<int*>(std::realloc(p, 10 * sizeof(int)));
      if (!q) {
        std::free(p);
        std::cerr << "realloc failed" << std::endl;
        return 1;
      }// 拡張後の内容を出力（追加領域の値は未規定）
      for (int i = 0; i < 10; ++i) {
        std::cout << q[i] << ' ';
      }
      std::cout << std::endl;
      std::free(q);
    }

## 出力例

    0 1 2 3 4 0 0 0 0 0

## 関連項目

- `calloc`: メモリを確保する
- `malloc`: メモリを確保し、領域をゼロ初期化する
- `free`: 確保したメモリを解放する

## 参照

- P3348R4 C++26 should refer to C23 not C17
  - C++26がC23を参照するようになり、`new_size`が0の場合がエラー性動作となった