【问题标题】:Why is a pointer not permitted to be null when calling the deallocate method of the allocator class?为什么调用分配器类的deallocate方法时指针不允许为空?
【发布时间】:2015-01-07 22:04:03
【问题描述】:

我可以在阅读C++ Primer 时看到这一点:

我们传递给deallocate的指针不能为null;它必须指向 由 allocate 分配的内存。

我查了deallocate的来源,发现了这个:

// __p is not permitted to be a null pointer.
void
deallocate(pointer __p, size_type)
{ ::operator delete(__p); }

好的,所以我知道delete 表达式和operator delete() 之间存在区别。 delete 表达式可用于空指针。但是,此函数直接调用全局operator delete() 函数。但是,我用谷歌搜索了这个问题,发现了一篇博文here,其中还指出全局运算符删除方法也检查空指针,如下所示:

void
operator delete (void* ptr) throw ()
{
  if (ptr)
    std::free (ptr);
}

另外,具有讽刺意味的是,我还发现 here 在空指针上调用 std::free 也没有效果......所以我的问题是,为什么不允许 __p 成为空指针?

【问题讨论】:

  • C++11 中有一些与在 NULL 指针上调用 delete 有关的变化。请参阅my question 关于该主题。
  • 不能要求释放器释放它自己没有分配的内存。在分配时从不返回 NULL 的自定义分配器应该能够假定它从未被要求释放 NULL。

标签: c++ pointers allocator delete-operator


【解决方案1】:

根据documentation for std::allocator::deallocate:

释放指针 p 引用的存储空间,它必须是通过先前调用 allocate() 获得的指针。参数 n 必须等于调用 allocate() 最初产生 p 的第一个参数。

调用::operator delete(void*),但未指定何时以及如何调用它。

在我看来,这个规范允许分配器假定指针不为空。您正在查看的分配器直接将指针传递给::operator delete(),但并非所有分配器都如此。

【讨论】:

    猜你喜欢
    • 2020-11-19
    • 2020-05-08
    • 1970-01-01
    • 2011-06-26
    • 2023-04-05
    • 1970-01-01
    • 2022-01-19
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多