Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;内存分配器和多态类型_C++_Stl_Standards_Allocator - Fatal编程技术网

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

C++ C++;内存分配器和多态类型,c++,stl,standards,allocator,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

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

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类{…};
C类:公共A、公共B{…};
std::分配器alloc_c;
自动分配=分配分配(1);
//案例A:指向A和指向C的指针指向相同的内存地址
分配器alloc_a(alloc_c);
分配-解除分配((a*)分配,1);
//案例B:指向B和C的指针指向不同的内存地址
分配器alloc_b(alloc_c);
alloc_b.deallocate((b*)p_c,1);

当然,这是案例A或案例B,而不是两者。

17.6.3.5中的表28以这种方式定义了
解除分配

a.deallocate(p,n)
:在调用之前,应销毁
p
所指区域中的所有
n
T
对象<代码>n应与传递给
分配
的值匹配,以获得该内存。不抛出异常。[注:
p
不得为单数。-结束注]

根据上面的表27,
p
是“类型
XX::pointer
的值,通过调用
a1.allocate
获得,其中
a1==a
”(
XX
是“类型
分配器”
”,而
X
是“类型
T
的分配器类”)。此外,
a
a1
是“类型
X&
的值”

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

在这一点上,我们有

1.3.24未定义的行为

本国际标准不要求的行为 [注:当本国际标准省略任何明确的行为定义时,可能会出现未定义的行为…]


我很确定这是UB。你应该重新绑定分配器,而不是抛出指针。@Columbo什么是UB?