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)