std::calloc
From cppreference.com
| ヘッダ <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
| C ドキュメント (calloc)
|