名前空間
変種
操作

std::calloc

提供: cppreference.com
< cpp‎ | memory‎ | c
 
 
 
動的メモリ管理
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
C のライブラリ
calloc
低水準のメモリ管理
 
ヘッダ <cstdlib> で定義
void* calloc( std::size_t num, std::size_t size );

サイズ size のオブジェクト num 個の配列用のメモリを確保し、全ビットをゼロに初期化します。

確保が成功した場合は、あらゆるオブジェクト型に対して適切にアラインされた、確保されたメモリブロックの最も低位の (最初の) バイトを指すポインタを返します。

size がゼロの場合、動作は処理系定義です (ヌルポインタが返されるかもしれませんし、記憶域にアクセスするためには使用できない何らかの非ヌルなポインタが返されるかもしれません)。

以下の関数はスレッドセーフであることが要求されます。

記憶域の特定の単位を確保または解放するこれらの関数の呼び出しは単一の全順序で発生し、そのような解放の呼び出しそれぞれはこの順序における次の確保 (もしあれば) に対して先行発生します。

(C++11およびそれ以降)

目次

[編集] 引数

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

[編集] 戻り値

成功した場合は、新たに確保されたメモリの先頭を指すポインタを返します。 メモリリークを回避するためには、返されたポインタは std::free() または std::realloc() で解放しなければなりません。

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

[編集] ノート

アライメント要件のため、確保されるバイト数は 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
}

[編集]

#include <iostream>
#include <cstdlib>
 
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

[編集] 関連項目