在空指针上调用Allocator_traits :: Deallocation
Calling allocator_traits::deallocate on a null pointer
如果Allocator
符合标准库分配器接口,是否可以安全地使用null指针调用std::allocator_traits<Allocator>::deallocate
?我知道是Allocator
是std::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()
函数。也就是说,零指针也不是有效的参数。
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- cv::D ataType<> 与 cv::traits::Type<>
- Wt 3 memory deallocation
- 在空指针上调用Allocator_traits :: Deallocation
- C 4D数组内存Deallocation速度很慢
- 为什么当对象构造函数投入新表达式时,为什么不调用DealLocation函数
- 将指针存储在STL容器中,以供以后进行DealLocation
- 类型 traits,用于检查参数包中的所有类型是否都是可复制构造的
- 对采用"traits"模板参数的对象进行单元测试
- 3.7.4.2[basic.stc.dynamic.deallocation]/2 中 C++14 中的脚注 37 的原因是什么?
- C++:是否有一个包含各种函数的traits类来操作以零结尾的char*和wchar_t*字符串
- Deallocation函数禁止使用带有两个参数的分配
- 无法将'SEXP'转换为"Rcpp::traits::input_parameter<double>
- C++:使用内部typedef(如果traits类或默认值中可用)
- 通过traits类特殊化函数
- 在traits中定义类型vs在class中定义类型
- C++0x标准中使用/定义了什么样的"Traits"
- 通过在编译时用模板类使用traits抛出错误来禁用一个函数
- 继承自traits类
- 错误 C2039: 'type_name': 不是 的成员 'swig::traits<Bar>'