在空指针上调用allocator_traits :: deallocate

时间:2017-12-12 23:44:58

标签: c++ memory-management

如果Allocator符合标准库分配器接口,使用空指针调用std::allocator_traits<Allocator>::deallocate是否安全?我知道当Allocatorstd::allocator时(因为它最终会推迟到delete),但如果Allocator是客户提供的课程怎么办?我必须做一个明确的检查吗? cppreference.com关于Allocator concept的文章没有列出任何此类保证,因此我认为答案是肯定的,但我想确定。

为了给出一些问题的动机,我想象一个变量p应该保存指向缓冲区的指针(最初设置为nullptr)的用例,但由于某种原因,缓冲区从未在第一个位置分配,因此p仍为空指针。

1 个答案:

答案 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()函数。也就是说,空指针也不是那里的有效参数。