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共にこの関数は実装されなかった
関連項目
参照
- 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::destroy
is extraneous