内存分配器是否应该与多态类型一起使用? 例如,下面的代码是否正确?
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,都不是。
答案 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;的分配器类;) 。此外,a
和a1
是&#34;类型为X&
&#34;的值。
换句话说,标准没有设想将deallocate
传递给由不同类型的分配器分配的指针。它仅指定当deallocate
被赋予由同一分配器对象分配的指针时发生的情况,或者指定与该分配器相等的相同类型的另一个分配器。
此时,我们有
1.3.24 未定义的行为
本国际标准没有要求的行为 [注意:当本国际标准忽略任何明确的行为定义时,可能会出现未定义的行为......]