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

履歴 編集

function template
<memory_resource>

std::pmr::polymorphic_allocator::destroy(C++17)(C++20で非推奨)

template <class T>
void destroy(T* p);

この関数はC++20で非推奨となった。不要な機能ではあるが、代わりが必要であればallocator_traits<Alloc>::destroy()もしくはdestroy_at()を使用すること。

概要

指定された領域にあるTのオブジェクトを破棄する。

引数

  • p -- 対象となるオブジェクトが構築されているメモリへのポインタ

効果

あたかもp->~T()を実行したように、pの指すTのオブジェクトを破棄する。

メモリ領域の解放は行われないため、別にdeallocateで行う必要がある。

非推奨の詳細

polymorphic_allocatorも含めたアロケータはコンテナから利用される際にallocator_traitsを介して利用され、allocator_traitsの提供するデフォルト実装によってアロケータとしての多くの部分が補われる。

本関数は、allocator_traits<Alloc>::destroy()で提供されているデフォルト実装と完全に同一の実装となっており、追加の事を何もしていない。従って有用性は何もなく、非推奨とされた。

おそらく、construct()メンバ関数との対称性を意識して追加されていたものと思われる。なお、construct()メンバ関数はuses-allocator 構築のために追加の仕事を担っており、こちらの関数には有用であるため非推奨とはされていない。

allocator_traitsを介してpolymorphic_allocatorを使用する場合は本関数の有無を気にする必要はないが、もし本関数が必要となった場合は代わりにdestroy_at()を利用できる。

#include <iostream>
#include <memory_resource>

int main()
{
  std::pmr::polymorphic_allocator<int> alloc{};

  //メモリの確保
  int* array = alloc.allocate(4);

  //要素を構築
  for (int i = 0; i < 4; ++i) {
    alloc.construct(array + i, i);
  }

  for (int i = 0; i < 4; ++i) {
    std::cout << array[i] << std::endl;
  }

  //要素を破棄
  for (int i = 0; i < 4; ++i) {
    alloc.destroy(array + i);
  }

  //メモリの解放
  alloc.deallocate(array, 4);
}

出力

0
1
2
3

バージョン

言語

  • C++17

処理系

  • Clang: ??
  • GCC: 9.1
  • Visual C++: ??
    • 2017, 2019共にこの関数は実装されなかった

関連項目

参照