名前空間
変種
操作

std::calloc

From cppreference.com
< cpp‎ | memory‎ | c
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ
calloc

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
ヘッダ <cstdlib> で定義
void* calloc( std::size_t num, std::size_t size );

サイズ size のオブジェクト num 個の配列のためにメモリを割り当て、それをすべてビットゼロに初期化します(宛先領域でオブジェクトを暗黙的に作成します)。

割り当てが成功した場合、割り当てられたメモリブロック内の、任意のオブジェクト型に対して適切にアラインされた最も低い(最初の)バイトへのポインタを返します。

size がゼロの場合、動作は実装定義です(ヌルポインタが返される場合もあれば、ストレージにアクセスするために使用できない非ヌルポインタが返される場合もあります)。

以下の関数はスレッドセーフである必要がある

これらの関数に対する、特定のストレージ単位を割り当てるまたは解放する呼び出しは、単一の総順序で発生し、そのような各解放呼び出しは、この順序での次の割り当て(もしあれば)よりhappens-beforeである。

(C++11以降)

目次

[編集] Parameters

num - オブジェクトの数
size - 各オブジェクトのサイズ

[編集] Return value

成功した場合、新しく割り当てられたメモリの先頭へのポインタを返します。メモリリークを回避するため、返されたポインタは std::free() または std::realloc() で解放する必要があります。

失敗した場合、ヌルポインタを返す。

[編集] Notes

アラインメント要件のため、割り当てられたバイト数は必ずしも num * size とは限りません。

すべてビットゼロへの初期化は、浮動小数点数またはポインタがそれぞれ 0.0 およびヌルポインタ値に初期化されることを保証しません(ただし、これはすべての一般的なプラットフォームで真です)。

元々(C89)、以下のようなコードをサポートするためにゼロサイズのサポートが追加されました。

OBJ *p = calloc(0, sizeof(OBJ)); // "zero-length" placeholder
...
while (1)
{ 
    p = realloc(p, c * sizeof(OBJ)); // reallocations until size settles
    ... // code that may change c or break out of loop
}

[編集] Example

#include <cstdlib>
#include <iostream>
 
int main()
{
    int* p1 = (int*)std::calloc(4, sizeof(int)); // allocate and zero out an array of 4 int
    int* p2 = (int*)std::calloc(1, sizeof(int[4])); // same, naming the array type directly
    int* p3 = (int*)std::calloc(4, sizeof *p3); // same, without repeating the type name
 
    if (p2)
        for (int n = 0; n < 4; ++n) // print the array
            std::cout << "p2[" << n << "] == " << p2[n] << '\n';
 
    std::free(p1);
    std::free(p2);
    std::free(p3);
}

出力

p2[0] == 0
p2[1] == 0
p2[2] == 0
p2[3] == 0

[編集] See also

English 日本語 中文(简体) 中文(繁體)