在空指针上调用Allocator_traits :: Deallocation

Calling allocator_traits::deallocate on a null pointer

本文关键字:traits Deallocation Allocator 空指针 调用      更新时间:2023-10-16

如果Allocator符合标准库分配器接口,是否可以安全地使用null指针调用std::allocator_traits<Allocator>::deallocate?我知道是Allocatorstd::allocator(因为它最终为delete辩护),但是如果Allocator是客户端提供的类,该怎么办?我必须进行明确的检查吗?cppreference.com关于分配器概念的文章没有列出任何此类保证,所以我认为答案是"是",但我想确定。

要为这个问题提供一些动力,我想象一个用例,其中可变的p应该容纳指向缓冲区的指针(并且最初是设置为nullptr),但是由于某种原因,缓冲区从来都不是首先分配了p仍然是无效的指针。

首先, std::allocator<T>::deallocate(T* p, std::size_t) dik call delete p。取而代之的是,它根据23.10.9.1 [talcator.members]拨打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()不会应对NULL指针。

问题是关于allocator_traits<...>::deallocate()。但是,根据23.10.8.2 [Aralocator.traits.mbers]第3段此函数仅将其委派给分配器的deallocate()函数。也就是说,零指针也不是有效的参数。