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的部分.这是本书中的一段代码

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来增加容量,我们将有两种类型的数据:

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

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