如果Allocator
符合标准库分配器接口,使用空指针调用std::allocator_traits<Allocator>::deallocate
是否安全?我知道当Allocator
为std::allocator
时(因为它最终会推迟到delete
),但如果Allocator
是客户提供的课程怎么办?我必须做一个明确的检查吗? cppreference.com
关于Allocator concept的文章没有列出任何此类保证,因此我认为答案是肯定的,但我想确定。
为了给出一些问题的动机,我想象一个变量p
应该保存指向缓冲区的指针(最初设置为nullptr
)的用例,但由于某种原因,缓冲区从未在第一个位置分配,因此p
仍为空指针。
答案 0 :(得分:2)
首先,std::allocator<T>::deallocate(T* p, std::size_t)
不致电delete p
。相反,它根据23.10.9.1 [allocator.members]第7段调用operator delete(p)
。相反,同一段第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段,此函数仅委托分配器的deallocate()
函数。也就是说,空指针也不是那里的有效参数。