最終更新日時: 2024年06月11日 22時45分38秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<memory_resource>

# std::pmr::polymorphic_allocator::deallocate(C++17)

    void deallocate(Tp* p, std::size_t n);

## 概要

指定されたメモリ領域を解放する。

## 要件

利用する`memory_resource`のポインタを`memory_rsrc`というメンバに保持しているとして
`p`は、`(*memory_rsrc == x) == true`となるような`x`の`x.allocate(n * sizeof(Tp), alignof(Tp))`によって以前に確保された領域であること。

つまりは、同じオブジェクトであるか、同じメモリプールを共有しているような`memory_resource`のオブジェクトによって事前に確保された領域であること。

そして、そのメモリ領域は未解放であること。

## 引数

- `p` -- 解放する領域の先頭へのポインタ
- `n` -- 解放する領域の個数、バイト数ではなく配列の要素数相当

## 効果

利用する`memory_resource`のポインタを`memory_rsrc`というメンバに保持しているとすると、以下と等価である。
`memory_rsrc->deallocate(p, n * sizeof(Tp), alignof(Tp));`

## 例外

投げない。

## 例

    #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 update 6 ✅

## 関連項目

- `memory_resource::deallocate`
- `allocator_traits<T>::deallocate`

## 参照

- 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