void* allocate(size_t bytes, size_t alignment = alignof(max_align_t)); // (1) C++17
[[nodiscard]]
void* allocate(size_t bytes, size_t alignment = alignof(max_align_t)); // (1) C++20
概要
指定されたバイト数とアライメントでメモリを確保する。
事前条件
呼び出すdo_allocate
の要件として
alignment
は2の累乗であること。
引数
bytes
-- 確保したい領域のサイズ(バイト数)alignment
-- 確保領域へのアライメント要求
効果
return this->do_allocate(bytes, alignment);
と等価。
少なくともbytes
のメモリを確保し、alignment
にアラインする。
戻り値
確保したメモリ領域の先頭ポインタ。
例外
要求されたアライメントでサイズbytes
のメモリを確保できない場合、例外が送出される。
例
#include <iostream>
#include <memory_resource>
int main(){
std::pmr::memory_resource* mr = std::pmr::get_default_resource();
//int1つ分の領域をintのアライメント要求(多くの環境で共に4バイト)でメモリ確保
void* p = mr->allocate(sizeof(int), alignof(int));
//placement new して構築
int* p_int = new(p) int{ 256 };
std::cout << *p_int << std::endl;
//一応アドレスを出力
std::cout << p << std::endl;
std::cout << p_int << std::endl;
//デストラクタを呼び出してオブジェクトを破棄
std::destroy_at(p_int);
//メモリの解放
mr->deallocate(p, sizeof(int), alignof(int));
}
出力例(VS2019 Preview2)
256
000002373BB96970
000002373BB96970
バージョン
言語
- C++17
処理系
- Clang: ??
- GCC: 9.1 ✅
- Visual C++: 2017 update 6 ✅
参照
- P0220R1 Adopt Library Fundamentals V1 TS Components for C++17 (R1)
- P0337r0 | Delete operator= for polymorphic_allocator
- Working Draft, C++ Extensions for Library Fundamentals, Version 2
- P0600R1
[[nodiscard]]
in the Library, Rev1 - LWG Issue 2843. Unclear behavior of
std::pmr::memory_resource::do_allocate()