C++默认分配器 - 如果大小不等于传递给allocate调用的大小,会发生什么?

0xb*_*00d 6 c++ std allocator

20.6.9:

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

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

编辑: 我实际上对"应该发生什么"的意思是:在自定义实现中抛出或断言是否可以?

sha*_*oth 10

像往常一样在C++标准中,当没有明确说明时,违反要求会导致不确定的行为.应该始终意味着,这是一项要求,而不是C++标准中的一个选项.

例如,这是MSDN所说的:

指针_Ptr必须先前通过调用分配给比较等于*this的分配器对象,分配相同大小和类型的数组对象.

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