我刚刚读到std::allocator
。在我看来,使用它比使用它更复杂new
and delete
.
With allocator
我们必须显式分配堆内存、构造它、销毁它,然后最终释放内存。那么它为何被创建呢?
什么情况下可以使用它,什么时候应该使用它来代替new和delete?
在我看来,使用它比使用new和delete更复杂。
是的,但它并不意味着取代new
and delete
,它有不同的目的。
使用分配器,我们必须显式分配堆内存,构造它,销毁它,然后最终释放内存。
那么它为何被创建呢?
因为有时您希望将分配和构造分为两个步骤(类似于将销毁和释放分为两个步骤)。如果您不想这样做,请不要使用分配器,请使用new
反而。
什么情况下可以使用它,什么时候应该使用它来代替new和delete?
当您需要分配器的行为而不是new
and delete
, 明显地!典型的情况是实现容器时。
考虑以下代码:
std::vector<X> v;
v.reserve(4); // (1)
v.push_back( X{} ); // (2)
v.push_back( X{} ); // (3)
v.clear(); // (4)
这里第 (1) 行必须为四个对象分配足够的内存,但尚未构造它们。然后第 (2) 行和第 (3) 行必须将对象构造到分配的内存中。然后第 (4) 行必须销毁这些对象,但不释放内存。最后,在向量的析构函数中,可以释放所有内存。
所以向量不能只使用new X()
or delete &m_data[1]
要创建和销毁对象,它必须与构造/销毁分开执行分配/释放。容器的分配器模板参数定义应用于分配(取消)内存和构造/销毁对象的策略,从而允许自定义容器对内存的使用。默认策略是std::allocator
type.
因此,当需要分配器时(例如使用容器时),您可以使用分配器,并且可以使用std::allocator
当您不想提供自定义分配器而只想使用标准分配器时。
您不使用分配器来替代new
and delete
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)