C ++内存分配器和多态类型

时间:2015-01-10 17:09:13

标签: c++ stl standards allocator

内存分配器是否应该与多态类型一起使用? 例如,下面的代码是否正确?

class A { ... };
class B { ... };
class C : public A, public B { ... };

std::allocator<C> alloc_c;
auto p_c = alloc_c.allocate(1);

// CASE A: pointer to A and to C point to the same memory address
std::allocator<A> alloc_a(alloc_c);
alloc_a.deallocate((A*)p_c, 1);

// CASE B: pointer to B and to C point to the different memory addresses
std::allocator<B> alloc_b(alloc_c);
alloc_b.deallocate((B*)p_c, 1);

当然,无论是案例A还是案例B,都不是。

1 个答案:

答案 0 :(得分:2)

17.6.3.5 中的表28以这种方式定义deallocate

  

a.deallocate(p,n)n指向的区域中的所有T p个对象都应在此次调用之前销毁。 n应匹配传递给allocate的值以获取此内存。不抛出异常。 [注意:p不得单数.-尾注]

根据上面的表27,p是&#34;类型XX::pointer的值,通过调用a1.allocate获得,其中a1 == a&#34; (其中XX为&#34;类型allocator_traits<X>&#34;和X为&#34;类型T&#34;的分配器类;) 。此外,aa1是&#34;类型为X&&#34;的值。

换句话说,标准没有设想将deallocate传递给由不同类型的分配器分配的指针。它仅指定当deallocate被赋予由同一分配器对象分配的指针时发生的情况,或者指定与该分配器相等的相同类型的另一个分配器。

此时,我们有

  

1.3.24 未定义的行为

     

本国际标准没有要求的行为   [注意:当本国际标准忽略任何明确的行为定义时,可能会出现未定义的行为......]