小编Eve*_*ard的帖子

容器使用的内部类型的内存分配

C++ 11标准在通用容器要求中有以下几行.

(23.2.1 - 3)

对于受此子条款影响且声明allocator_type的组件,存储在这些组件中的对象应使用allocator_traits :: construct函数构造,并使用allocator_traits :: destroy函数(20.6.8.2)进行销毁.这些函数仅针对容器的元素类型调用,而不是针对容器使用的内部类型调用

(23.2.1 - 7)

除非另有说明,否则本节中定义的所有容器都使用分配器获取内存

是否真的,容器使用的所有内存都是由指定的分配器分配的?因为标准说内部类型不是用allocator_traits :: construct构造的,所以应该对operator new进行某种调用.但是标准也说这个子句中定义的所有容器都使用分配器来获取内存,在我看来这意味着它不能是普通的新运算符,它必须是放置新的运算符.我对么?

让我举个例子,为什么这很重要.

假设我们有一个类,它包含一些已分配的内存:

#include <unordered_map>
#include <iostream>
#include <cstdint>
#include <limits>
#include <memory>
#include <new>

class Arena
{
public:
        Arena(std::size_t size)
        {
                size_     = size;
                location_ = 0;

                data_ = nullptr;
                if(size_ > 0)
                        data_ = new(std::nothrow) uint8_t[size_];
        }
        Arena(const Arena& other) = delete;
        ~Arena()
        {
                if(data_ != nullptr)
                        delete[] data_;
        }
        Arena& operator =(const Arena& arena) = …
Run Code Online (Sandbox Code Playgroud)

c++ std allocator c++11

6
推荐指数
1
解决办法
940
查看次数

标签 统计

allocator ×1

c++ ×1

c++11 ×1

std ×1