6

20.6.9:

void deallocate(pointer p, size_type n);
  • 要求:p 应该是从 allocate() 获得的指针值。n 应等于作为第一个参数传递给返回 p 的 allocate 调用的值。
  • 效果:释放 p 引用的存储空间。
  • 备注:使用 ::operator delete(void*) (18.6.1),但在调用此函数时未指定。

如果n不等于作为第一个参数传递给返回的 allocate 调用的值,会发生什么p?不解除分配?扔std::bad_alloc?...

编辑: 我对“应该发生什么”的真正意思是:在自定义实现中抛出或断言可以吗?

4

3 回答 3

10

与 C++ 标准中的往常一样,当没有明确说明时,违反要求会导致未定义的行为。始终意味着必须,这是一项要求,而不是 C++ 标准中的选项。

例如,这是MSDN 所说的:

指针 _Ptr 必须早先通过调用 allocate 为比较等于 *this 的分配器对象返回,分配相同大小和类型的数组对象。

这意味着大小必须精确匹配,否则会遇到未定义的行为。

于 2011-07-21T06:46:50.843 回答
3

它没有说。这意味着这将是令人讨厌的“未定义行为”。

于 2011-07-21T06:48:02.457 回答
1

This is present in the standard to allow for underlying allocators that do not know the size of an allocation from its pointer.

For example, the AmigaOS allocator maintains a list of free memory blocks and even allows partial deallocation (i.e. if I allocate 1024 bytes, then free 512 bytes at offset 256, I end up with two 256 byte allocations), so the allocator expects me to pass this information to the deallocator.

于 2011-07-21T12:46:31.900 回答