c++ - 在空指针上调用 allocator_traits::deallocate

标签 c++ memory-management

如果Allocator符合标准库分配器接口(interface),调用std::allocator_traits<Allocator>::deallocate是否安全带有空指针?我知道是在Allocator的时候是 std::allocator (因为它最终遵循 delete )但是如果 Allocator 呢?是客户提供的类(class)吗?我必须进行明确的检查吗? cppreference.com的文章 Allocator concept没有列出任何此类保证,所以我认为答案是"is",但我想确定一下。

为了给这个问题带来一些动机,我想象了一个用例,其中变量 p应该保存指向缓冲区的指针(并且最初设置为 nullptr ),但由于某种原因,缓冲区从未首先分配,所以 p仍然是一个空指针。

最佳答案

首先,std::allocator<T>::deallocate(T* p, std::size_t) 调用 delete p 。相反,它调用 operator delete(p)根据 23.10.9.1 [allocator.members] 第 7 段。相反,同一段第 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 段,此函数仅委托(delegate)给 deallocate()分配器的功能。也就是说,空指针也不是有效的参数。

关于c++ - 在空指针上调用 allocator_traits::deallocate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47783379/

相关文章:

c++ - C++ Linux 套接字编程

c++ - 从 QObject 继承时,将复制构造函数设置为默认值不起作用

c++ - C++中的奇怪指针

java - 捕获 OutOfMemoryError 但不增加堆大小

java - 当字符串实习生()方法被调用时

c++ - 一个使用 libvlc 播放 mp3 的简单 C 程序

C++ - 如何检查类型对齐要求

ios - 保留 UIImagePickerController 的委托(delegate)

c++ - 在 C++ 中调用 free() 在调试中触发 ntdll!DbgBreakPoint() 但在发布时崩溃

python - 在 Python 中智能缓存昂贵的对象