名前空間
変種
操作

std::malloc

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

アロケータ
メモリリソース
ガベージコレクションのサポート
(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* 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_uniquestd::make_shared、コンテナのコンストラクタなどを使用することであり、低レベルのライブラリコードではnew-expressionを使用する。

大きなファイルをロードする場合、ファイル読み込み用のバッファを割り当てるよりも、OS固有の関数(POSIX上のmmapや、Windows上のCreateFileMappingA/WMapViewOfFileなど)を介したファイルマッピングの方が好ましい。

[編集]

#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で削除)
未初期化ストレージを取得します
(関数テンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)