如果Allocator
符合标准库分配器接口,使用空指针调用std::allocator_traits<Allocator>::deallocate
是否安全?我知道是Allocator
是std::allocator
的时候(因为它最终会顺应delete
),但是如果Allocator
是客户端提供的类怎么办?我需要做一个明确的检查吗? cppreference.com
在Allocator concept上的文章没有列出任何此类保证,因此我认为答案是“是”,但我想确定一下。
为了给这个问题提供一些动力,我想象一个用例,其中变量p
应该持有指向缓冲区的指针(最初设置为nullptr
),但是由于某种原因,缓冲区是从来没有分配过,所以p
仍然是空指针。
最佳答案
首先,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()
函数。也就是说,空指针也不是有效的参数。
关于c++ - 在空指针上调用allocator_traits::deallocate,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47783379/