c – 为什么std :: vector使用std :: allocator而不是operator new和delete?

前端之家收集整理的这篇文章主要介绍了c – 为什么std :: vector使用std :: allocator而不是operator new和delete?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
参见英文答案 > What’s the advantage of using std::allocator instead of new in C++?7个
我正在阅读该语言作者的“使用C编程原理和实践”一书.

我正在阅读本书基本描述如何实现std :: vector的部分.这是本书中的一段代码

  1. template<typename T,typename A = std::allocator<T>> class vector {
  2. A alloc;
  3. int space,size;
  4. T* elem;
  5. //...some code
  6. reserve(int newalloc) {
  7. if (newalloc <= space) return; // never decrease allocation
  8. T* p = alloc.allocate(newalloc); // allocate new space
  9. for (int i = 0; i < sz; ++i) alloc.construct(&p[i],elem[i]); // copy
  10. for (int i = 0; i < sz; ++i) alloc.destroy(&elem[i]); // destroy
  11. alloc.deallocate(elem,space); // deallocate old space
  12. elem = p;
  13. space = newalloc;
  14. }
  15. };

书中提到我们必须使用std :: allocator,因为向量的数据结构包含一些初始化数据和一些未初始化的数据.

我不清楚这意味着什么.如果我使用new和delete会出现什么问题?

  1. template<typename T> class vector2 {
  2. A alloc;
  3. int space,size;
  4. T* elem;
  5. //some code
  6. reserve(int newalloc) {
  7. if (newalloc <= space) return;
  8. T* p = new T[newallow];
  9. for (int i = 0; i < sz; ++i) p[i] = elem[i];
  10. delete[] elem;
  11. elem = p;
  12. space = newalloc;
  13. }
  14. };

解决方法

What could go wrong if I use new and delete?

  1. T* p = new T[newallow];

一个原因是如果T没有默认构造函数,这将无法编译.

分配器的基本思想是分离分配内存和对象构造的步骤.默认新组合两者.在矢量保留的情况下,我们只想分配所需的内存.我们不能在那时构造或初始化对象,因为类型可能不是默认可构造的.只有当我们传递对象以存储在某些其他操作中时,才可以构造对象.

  1. v[i] = myObj;

如果不在两个不同的步骤中分离内存分配和对象构造,则无法实现这一点.

另请注意,当有人想要自定义内存分配时,分配器具有高级用法.

The book mentions that we have to use std::allocator because the vector’s data structure consists some initialized data and some uninitialized data.

作者在这里的意思是,通过调用reserve来增加容量,我们将有两种类型的数据:

>向量中需要移动到新空间的现有对象.它们是初始化数据.>额外保留空间,不存储任何对象,因此未初始化.

猜你在找的C&C++相关文章