- memory_resource[meta header]
- function template[meta id-type]
- std::pmr[meta namespace]
- polymorphic_allocator[meta class]
- cpp17[meta cpp]
- cpp20deprecated[meta cpp]
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);
}- destroy[color ff0000]
- allocate[link allocate.md]
- construct[link construct.md]
- deallocate[link deallocate.md]
0
1
2
3
- C++17
- Clang: ??
- GCC: 9.1
- Visual C++: ??
- 2017, 2019共にこの関数は実装されなかった
- P0220R1 Adopt Library Fundamentals V1 TS Components for C++17 (R1)
- P0337r0 | Delete operator= for polymorphic_allocator
- Working Draft, C++ Extensions for Library Fundamentals, Version 2
- destroy: Missing member function of std::pmr::polymorphic_allocator - Developer Community
- LWG Issue 3036.
polymorphic_allocator::destroyis extraneous