Skip to content

Latest commit

 

History

History
80 lines (56 loc) · 2.63 KB

destroy.md

File metadata and controls

80 lines (56 loc) · 2.63 KB

destroy

  • memory[meta header]
  • std[meta namespace]
  • allocator[meta class]
  • function[meta id-type]
  • cpp17deprecated[meta cpp]
  • cpp20removed[meta cpp]
// C++03
void destroy(pointer p);

// C++11
template <class U>
void destroy(U* p);

この関数は、C++17から非推奨となり、C++20で削除された。代わりにstd::allocator_traits::destroy()関数を使用すること。

概要

インスタンスを破棄する。

効果

  • C++03 : ((T*)p)->~T()
  • C++11 : p->~U()

戻り値

なし

非推奨・削除の詳細

多くのメンバ関数は、アロケータの実装によらず、共通に定義できるものだった。そのため、アロケータの中間インタフェースであるstd::allocator_traitsクラスに、共通のデフォルト実装を定義することとなった。

特殊なアロケータの実装では、この関数を独自に実装する必要があるかもしれない。その場合はstd::allocator_traitsのデフォルト機能を使用せずに、この関数を独自アロケータのインタフェースとして定義すれば、std::allocator_traitsクラスを介してインタフェースにアクセスしたとしても、その独自実装が使用される。

少なくとも、std::allocatorクラスのあらゆる標準ライブラリの実装において、この関数は特殊な動作をする必要がないため、std::allocator_traitsクラスのデフォルト実装に任せることとなった。

#include <iostream>
#include <memory>
#include <utility>

int main()
{
  using value_type = std::pair<int, char>;
  std::allocator<value_type> alloc;

  std::size_t n = 1;
  value_type* p = alloc.allocate(n);

  // メモリ領域にpairオブジェクトを構築
  alloc.construct(p, 3, 'a');

  std::cout << p->first << ", " << p->second << std::endl;

  // pairオブジェクトを破棄
  alloc.destroy(p);

  alloc.deallocate(p, n);
}
  • destroy[color ff0000]
  • alloc.allocate[link allocate.md]
  • alloc.construct[link construct.md]
  • alloc.deallocate[link deallocate.md]

出力

3, a

参照