最終更新日時(UTC):
が更新

履歴 編集

function template
<memory>

std::allocate_shared_for_overwrite(C++20)

namespace std {
  template<class T, class A>
  shared_ptr<T> allocate_shared_for_overwrite(const A& a);           // (1)

  template<class T, class A>
  shared_ptr<T> allocate_shared_for_overwrite(const A& a, size_t N); // (2)
}

概要

デフォルトの初期値を持つT型のオブジェクト、またはその配列へのshared_ptrを構築し、返却する。

要件

テンプレートパラメータACpp17Allocatorの要件を満たす。

効果

Tのオブジェクトにメモリを割り当てる(TU[]の場合はU[N]Nはそれぞれのオーバーロードで指定された引数から決定される)。メモリは、引数aのコピー(参照カウンタと型Tの本体を連続メモリ領域に配置するためにはTのサイズより大きい領域をアロケートする必要があるためにallocator_traits<Alloc>::rebind_alloc<value_type>を用いて再束縛されたもの)を使用して割り当てられる。

オブジェクトは、デフォルト初期化される。

例外がスローされた場合、関数は効果がない。

配列型Uのオブジェクトが(同じ型の)uの初期値を持つように指定されている場合、これは、オブジェクトの各配列要素が初期値としてuからの対応する要素を持つことを意味すると解釈される。

配列タイプのオブジェクトがデフォルトの初期値を持つように指定されている場合、これはオブジェクトの各配列要素がデフォルトの初期値を持つことを意味すると解釈される。

配列要素は、アドレスの昇順で初期化される。

戻り値によって管理されるオブジェクトのlifetimeが終了するか、配列要素の初期化が例外をスローすると、初期化された要素は元の構造の逆の順序で破棄される。

  • (1) : このオーバーロードが選択されるとき、Tは、不明な境界の配列ではない。T型のオブジェクトへのshared_ptrを返す。
  • (2) : このオーバーロードが選択されるとき、Tは、不明な境界の配列である。型U[N]のオブジェクトへのshared_ptrを返す。ここで、Uremove_extent_t<T>である。

戻り値

新しく構築されたオブジェクトのアドレスを格納および所有するshared_ptrインスタンス。

事後条件

r.get() != 0 && r.use_count() == 1, ここで、r は戻り値である。

例外

bad_alloc、またはallocateまたはオブジェクトの初期化からスローされた例外。

備考

同様の効果を持つ関数に、make_shared_for_overwrite()があるが、 この関数はメモリの確保にユーザー定義のアロケータを使用したい場合などに用いることができる。

#include <memory>
#include <iostream>

int main() {
  std::allocator<int> alloc;
  std::shared_ptr<int> sp = std::allocate_shared_for_overwrite<int>(alloc);
  if (sp) {
    std::cout << *sp << std::endl;
  }
}

出力

42

バージョン

言語

  • C++20

処理系

関連項目

参照