我正在阅读该语言作者的"使用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;
}
};
Run Code Online (Sandbox Code Playgroud)
书中提到我们必须使用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;
}
};
Run Code Online (Sandbox Code Playgroud)
tas*_*oor 13
如果我使用new和delete会出现什么问题?
T* p = new T[newallow];
Run Code Online (Sandbox Code Playgroud)
一个原因是如果T没有默认构造函数,这将无法编译.
分配器的基本思想是分离分配内存和对象构造的步骤.默认new结合了两者.在vector保留的情况下,我们只想分配所需的内存.我们当时无法构造或初始化对象,因为类型可能不是默认构造的.只有当我们传递对象以存储在某些其他操作中时,才可以稍后构造对象,例如
v[i] = myObj;
Run Code Online (Sandbox Code Playgroud)
如果不在两个不同的步骤中分离内存分配和对象构造,则无法实现这一点.
另请注意,当有人想要自定义内存分配时,分配器具有高级用法.
书中提到我们必须使用std :: allocator,因为向量的数据结构包含一些初始化数据和一些未初始化的数据.
这里作者的意思是,通过调用增加容量,reserve我们将有两种类型的数据:
| 归档时间: |
|
| 查看次数: |
772 次 |
| 最近记录: |