参见英文答案 >
What’s the advantage of using std::allocator instead of new in C++?7个
我正在阅读该语言作者的“使用C编程原理和实践”一书.
我正在阅读该语言作者的“使用C编程原理和实践”一书.
我正在阅读本书基本描述如何实现std :: vector的部分.这是本书中的一段代码:
- template<typename T,typename A = std::allocator<T>> class vector {
- A alloc;
- int space,size;
- T* elem;
- //...some code
- reserve(int newalloc) {
- if (newalloc <= space) return; // never decrease allocation
- T* p = alloc.allocate(newalloc); // allocate new space
- for (int i = 0; i < sz; ++i) alloc.construct(&p[i],elem[i]); // copy
- for (int i = 0; i < sz; ++i) alloc.destroy(&elem[i]); // destroy
- alloc.deallocate(elem,space); // deallocate old space
- elem = p;
- space = newalloc;
- }
- };
书中提到我们必须使用std :: allocator,因为向量的数据结构包含一些初始化数据和一些未初始化的数据.
我不清楚这意味着什么.如果我使用new和delete会出现什么问题?
- template<typename T> class vector2 {
- A alloc;
- int space,size;
- T* elem;
- //some code
- reserve(int newalloc) {
- if (newalloc <= space) return;
- T* p = new T[newallow];
- for (int i = 0; i < sz; ++i) p[i] = elem[i];
- delete[] elem;
- elem = p;
- space = newalloc;
- }
- };
解决方法
What could go wrong if I use new and delete?
- T* p = new T[newallow];
一个原因是如果T没有默认构造函数,这将无法编译.
分配器的基本思想是分离分配内存和对象构造的步骤.默认新组合两者.在矢量保留的情况下,我们只想分配所需的内存.我们不能在那时构造或初始化对象,因为类型可能不是默认可构造的.只有当我们传递对象以存储在某些其他操作中时,才可以构造对象.
- 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来增加容量,我们将有两种类型的数据:
>向量中需要移动到新空间的现有对象.它们是初始化数据.>额外保留空间,不存储任何对象,因此未初始化.