如果Allocator符合标准库分配器接口,使用空指针调用std::allocator_traits<Allocator>::deallocate是否安全?我知道是Allocatorstd::allocator的时候(因为它最终会顺应delete),但是如果Allocator是客户端提供的类怎么办?我需要做一个明确的检查吗? cppreference.comAllocator 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/

10-09 00:14