Skip to content

Latest commit

 

History

History
102 lines (79 loc) · 2.43 KB

File metadata and controls

102 lines (79 loc) · 2.43 KB

new_object

  • 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]

出力例(GCC9.2)

address : 0x1a2b150
address : 0x1a2b960
20
17

バージョン

言語

  • C++20

処理系

参照