如果Allocator
符合标准库分配器接口(interface),调用std::allocator_traits<Allocator>::deallocate
是否安全带有空指针?我知道是在Allocator
的时候是 std::allocator
(因为它最终遵循 delete
)但是如果 Allocator
呢?是客户提供的类(class)吗?我必须进行明确的检查吗? cppreference.com
的文章 Allocator concept没有列出任何此类保证,所以我认为答案是"is",但我想确定一下。
为了给这个问题带来一些动机,我想象了一个用例,其中变量 p
应该保存指向缓冲区的指针(并且最初设置为 nullptr
),但由于某种原因,缓冲区从未首先分配,所以 p
仍然是一个空指针。
最佳答案
首先,std::allocator<T>::deallocate(T* p, std::size_t)
不调用 delete p
。相反,它调用 operator delete(p)
根据 23.10.9.1 [allocator.members] 第 7 段。相反,同一段第 5 段中的要求指出 p
应从 std::allocator<T>::allocate()
获得。该函数不能返回空指针,即 std::allocator<T>::deallocate()
不接受零点。如果分配器概念允许将空指针传递为std::allocator<T>
,那将是令人惊讶的不会模拟这个概念。
表 31 中的分配器概念同样要求 a.deallocate(p)
的参数获自a.allocate()
。自规范a.allocate(n)
始终返回足够的内存 n
对象(唯一的失败指示是通过异常)因此 a.deallocate()
预计不会处理空指针。
问题是关于 allocator_traits<...>::deallocate()
。然而,根据 23.10.8.2 [allocator.traits.members] 第 3 段,此函数仅委托(delegate)给 deallocate()
分配器的功能。也就是说,空指针也不是有效的参数。
关于c++ - 在空指针上调用 allocator_traits::deallocate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783379/