最終更新日時(UTC):
が更新

履歴 編集

function
<cstdlib>

std::realloc

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

概要

確保済みの領域ptrnew_sizeに再確保する。

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

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

ptrnullptrを渡した場合、malloc(new_size)として動作する。

効果

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

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

戻り値

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

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

備考

  • new_sizeが0の場合の動作は未規定
  • 確保された領域はメモリリークを避けるため、freereallocで解放する必要がある。

#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: 確保したメモリを解放する