最終更新日時: 2025年02月27日 15時55分09秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<memory_resource>

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

    template <class T>
    [[nodiscard]] T* allocate_object(size_t n = 1); // (1) C++20
    template <class T>
    T* allocate_object(size_t n = 1);               // (1) C++26

## 概要

指定された個数の`T`型の配列として十分なメモリを確保する。

## 引数

- `n` -- 確保する領域の数、バイト数ではなく配列の要素数相当

## 効果

以下と等価。

    return static_cast<T*>(this->allocate_bytes(n*sizeof(T), alignof(T)));

## 戻り値

確保した領域の先頭へのポインタ。

## 例外

`SIZE_MAX / sizeof(T) < n`である場合、`std::length_error` 例外を送出する

## 備考

型`T`は引数から推論することができないため、明示的に指定する必要がある。

## 例

    #include <iostream>
    #include <memory_resource>

    int main() {

      constexpr int N = 10;

      std::pmr::polymorphic_allocator<> alloc{};

      //int型10個分の領域を確保
      int* p = alloc.allocate_object<int>(N);

      //確保した領域にintのオブジェクトを構築
      for (int i = 0; i < N; ++i) {
        alloc.construct(p+i, i);
      }

      for (int i = 0; i < N; ++i) {
        std::cout << p[i] << "\n";
      }

      //領域上のオブジェクトを破棄
      for (int i = 0; i < N; ++i) {
        alloc.destroy(p+i);
      }

      //確保したメモリ領域を解放
      alloc.deallocate_object(p, N);
    }

### 出力

    0
    1
    2
    3
    4
    5
    6
    7
    8
    9

## バージョン

### 言語

- C++20

### 処理系

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

## 関連項目

- `allocate_bytes`

## 参照

- P0339R6 `polymorphic_allocator<>` as a vocabulary type
- LWG Issue 3304. Allocate functions of `std::polymorphic_allocator` should require `[[nodiscard]]`
- P2422R1 Remove `nodiscard` annotations from the standard library specification
  - C++26で`[[nodiscard]]`指定が削除された