std::malloc
| ヘッダ <cstdlib> で定義 |
||
| void* malloc( std::size_t size ); |
||
未初期化のストレージをsizeバイト割り当てる。
アロケーションが成功した場合、割り当てられたメモリーブロック内の最低位(先頭)バイトへのポインタを返す。このポインタは、任意のスカラー型(std::max_align_tと少なくとも同じくらい厳密)に対して適切にアラインされる(宛先領域にオブジェクトを暗黙的に作成する)。
sizeがゼロの場合、動作は実装定義となる(ヌルポインタが返されるか、ストレージへのアクセスには使用できないがstd::freeに渡されなければならない非ヌルポインタが返される)。
|
以下の関数はスレッドセーフである必要がある
これらの関数に対する、特定のストレージ単位を割り当てるまたは解放する呼び出しは、単一の総順序で発生し、そのような各解放呼び出しは、この順序での次の割り当て(もしあれば)よりhappens-beforeである。 |
(C++11以降) |
目次 |
[編集] パラメータ
| size | - | 割り当てるバイト数 |
[編集] 戻り値
成功した場合、新しく割り当てられたメモリの先頭へのポインタを返す。メモリリークを避けるため、返されたポインタはstd::free()またはstd::realloc()で解放する必要がある。
失敗した場合、ヌルポインタを返す。
[編集] 備考
この関数はコンストラクタを呼び出したり、メモリを初期化したりすることはない。対応する解放関数が呼び出されることを保証できる既製のスマートポインタは存在しない。C++でのメモリ割り当ての推奨される方法は、RAII対応関数std::make_unique、std::make_shared、コンテナのコンストラクタなどを使用することであり、低レベルのライブラリコードではnew-expressionを使用する。
大きなファイルをロードする場合、ファイル読み込み用のバッファを割り当てるよりも、OS固有の関数(POSIX上のmmapや、Windows上のCreateFileMappingA/WとMapViewOfFileなど)を介したファイルマッピングの方が好ましい。
[編集] 例
#include <cstdlib> #include <iostream> #include <memory> #include <string> int main() { constexpr std::size_t size = 4; if (auto ptr = reinterpret_cast<std::string*>(std::malloc(size * sizeof(std::string)))) { try { for (std::size_t i = 0; i < size; ++i) std::construct_at(ptr + i, 5, 'a' + i); for (std::size_t i = 0; i < size; ++i) std::cout << "ptr[" << i << "] == " << ptr[i] << '\n'; std::destroy_n(ptr, size); } catch (...) {} std::free(ptr); } }
出力
p[0] == aaaaa p[1] == bbbbb p[2] == ccccc p[3] == ddddd
[編集] 関連項目
| メモリ割り当て関数 (関数) | |
| (C++17で非推奨)(C++20で削除) |
未初期化ストレージを取得します (関数テンプレート) |
| mallocのC言語ドキュメント
| |