最終更新日時: 2025年07月12日 02時16分44秒 (JST)
Koichi Murase が更新

履歴 編集

function
<memory_resource>

# std::pmr::polymorphic_allocator::delete_object(C++20)

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

## 概要

指定された領域にあるオブジェクトを破棄し、そのメモリ領域を解放する（`delete`式相当の処理を行う）。

## 事前条件

`p`の指すメモリ領域は以前に`*this`の確保関数のいずれかによって確保された領域であること。
かつ、そのメモリ領域は未解放であり`p`の指すオブジェクトは破棄されていないこと。

## 引数

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

## 効果

以下と等価。

### C++17

    this->destroy(p);
    this->deallocate_object(p);

### C++20

    allocator_traits<polymorphic_allocator>::destroy(*this, p)
    this->deallocate_object(p);

## 例

    #include <iostream>
    #include <memory_resource>

    int main() {
      //メモリ確保・解放処理を切り替え
      std::pmr::monotonic_buffer_resource mr{};
      std::pmr::polymorphic_allocator<> alloc{&mr};

      //int型の領域を確保しそこにオブジェクトを構築
      int* p1 = alloc.new_object<int>(20);
      //new式
      int* p2 = new int{17};

      std::cout << "address : " << p1 << "\n";
      std::cout << "address : " << p2 << "\n";

      std::cout << *p1 << "\n";
      std::cout << *p2 << "\n";

      //構築したオブジェクトを破棄し、確保したメモリ領域を解放
      alloc.delete_object(p1);
      //delete式
      delete p2;
    }

### 出力例（GCC9.2）

    address : 0x1a2b150
    address : 0x1a2b960
    20
    17

## バージョン

### 言語

- C++20

### 処理系

- Clang: ??
- GCC: 9.1 ✅
- Visual C++: 2019 update 9 ✅

## 参照

- P0339R6 polymorphic_allocator<> as a vocabulary type
- LWG Issue 3036. `polymorphic_allocator::destroy` is extraneous