调用分配器.构造基元
C++ Calling allocator.construct for Primitives
对于使用任意分配器分配的基本类型数组,是否有必要调用allocator.construct(),如下面的代码清单所示?这个类不需要将分配的内存初始化为任何特定的值,所以在我看来,用新分配的内存块调用allocator.construct()是不必要的。如果数组总是由基本类型组成,那么不调用这个方法有什么危险吗?
template <class T, template <class> class Allocator = std::allocator>
class foo
{
public:
typedef Allocator<T> allocator;
typedef typename allocator::pointer pointer;
private:
unsigned size_;
allocator alloc_;
pointer t_;
public:
foo(unsigned n) throw(std::bad_alloc) : size_(n), alloc_(),
t_(alloc_.allocate(n))
{
// Note that I do not call alloc_.construct() here.
}
~foo() { alloc_.deallocate(t_, size_); }
};
是。分配器可以自由地强加它想要的任何自定义记录,包括现有对象的数量。不能保证它只做new (memory) T(...)
。此外,这将是一个非常令人讨厌的惊喜的人改变你的代码,使它不再只是原语,然后发现它随机中断的某个时候。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- c++ 中的自定义分配器,用于不调用secure_string实现
- 在抛出"std::__cxx11::basic_string<char、std::char_traits<char>、std::分配器<char>>"的实例后调用终
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 在调用中使用 std::vector,<double>但收到有关 std::vector<double、std::分配器>正在使用的错误<double>
- std::cout 如果从自定义分配器 (Visual Studio 2019) 调用,则不会输出
- 不调用带有 std::vector 的自定义分配器
- 优化替换共享指针内容时对分配器的调用
- 在分配器感知类调用复制构造函数中对向量元素的引用
- forward_list,设置,列表等如何调用标准::分配器
- 使用自定义分配器调用对象构造函数/析构函数
- 通过从自定义分配器调用 deassigned 引发的不明原因异常
- 为什么std::list要不带参数地调用我的分配器?
- 调用分配器.构造基元
- 永远不要直接调用 std::分配器的成员函数是最佳做法吗?
- 如果容器和分配器都是同一内存池的一部分,我还需要调用std::容器的析构函数吗?