- memory_resource[meta header]
- function[meta id-type]
- std::pmr[meta namespace]
- polymorphic_allocator[meta class]
- cpp20[meta cpp]
template <class T, class... CtorArgs>
T* new_object(CtorArgs&&... ctor_args);
- pair[link /reference/utility/pair.md]
- tuple[link /reference/tuple/tuple.md]
- piecewise_construct_t[link /reference/utility/piecewise_construct_t.md]
メモリを確保しT
のオブジェクトを構築する(new
式相当の処理を行う)。
ctor_args...
--T
のコンストラクタへ渡す引数
以下と等価。
T* p = this->allocate_object<T>();
try {
this->construct(p, std::forward<CtorArgs>(ctor_args)...);
} catch (...) {
this->deallocate_object(p);
throw;
}
return p;
- allocate_object[link allocate_object.md]
- construct[link construct.md]
- deallocate_object[link deallocate_object.md]
構築したオブジェクトへのポインタ。
メモリの確保に失敗した場合およびT
のコンストラクタが例外を送出した場合、それぞれ任意の例外を送出しうる。
型T
は引数から推論することができないため、明示的に指定する必要がある。
#include <iostream>
#include <memory_resource>
int main() {
//メモリ確保・解放処理を切り替え
std::pmr::monotonic_buffer_resource mr{};
std::pmr::polymorphic_allocator<> alloc{&mr};
//int型の領域を確保しそこにオブジェクトを構築
int* p1 = alloc.new_object<int>(20);
//new式
int* p2 = new int{17};
std::cout << "address : " << p1 << "\n";
std::cout << "address : " << p2 << "\n";
std::cout << *p1 << "\n";
std::cout << *p2 << "\n";
//構築したオブジェクトを破棄し、確保したメモリ領域を解放
alloc.delete_object(p1);
//delete式
delete p2;
}
- new_object[color ff0000]
- monotonic_buffer_resource[link /reference/memory_resource/monotonic_buffer_resource.md]
- delete_object[link delete_object.md]
address : 0x1a2b150
address : 0x1a2b960
20
17
- C++20
- Clang: ??
- GCC: 9.1
- Visual C++: ??