zoukankan      html  css  js  c++  java
  • C++ Primer : 第十二章 : 动态内存之allocator类

    标准库allocator类定义在头文件 <memory>中。它帮助我们将内存分配和构造分离开来,它分配的内存是原始的、未构造的

    类似vector,allocator也是一个模板类,我们在定义一个allocator类类型的时候需要制定它要分配内存的类型,它会根据给定的对象类型来确定恰当的内存大小和对齐位置


    allocator<string> alloc;
    auto const p = alloc.allocate(n); // 分配n个未初始化的string


    allocator类的操作:

    allocator类及其算法
    allocator<T> a 定义了一个名为a的allocator对象,可以为类型为T的对象分配内存
    a.allocate(n) 分配一段原始的、未构造的内存,保存n个类型为T的对象
    a.deallocate(p, n) 释放从T*指针p中地址开始的内存,这块内存保存了n个类型为T的对象;p必须是一个先前由allocate成员函数返回的指针,且n必须是创建时候的大小,在destroy之前,用户必须在这块内存上调用destroy函数
    a.construct(p, args) p必须是一个类型为T*的指针,只想一块原始内存,args被传递给类型为T的构造函数
    a.destroy(p) p为T*类型的指针,此算法对p执行析构函数



    • allcator分配未构造的内存
    allocator分配的内存是未构造的,construct成员函数接受一个指针和零个或多个额外参数,在给定的位置构造一个元素,额外的参数用来初始化对象。这些额外参数必须和类型相匹配的合法的初始化器。 为了使用allocate返回的内存,我们必须用construct构造对象。
    auto q = p;
    alloc.construct(q++); // *q为空字符串
    alloc.construct(q++, 10, 'c'); // *q为cccccccccc
    alloc.construct(q++, "hi"); // *q为hi


    还未构造对象的情况下或者是使用原始内存是错误的:

    cout << *p << endl; // 正确,使用string的输出运算符
    cout << *q << endl; // 错误,q指向未构造的内存


    在这些对象使用结束后,我们使用destroy来销毁这些元素:

    while (q != p)
        alloc.destroy(--q);


    元素被销毁后,如果需要将内存归还给系统,就需要调用deallocate函数:

    alloc.deallocate(p, n);


    传递给deallocate的指针不能为空,必须指向由allocate分配的内存,而且,n必须为allocate分配时的大小


    • 拷贝和填充未初始化内存的算法
    标准库为allocator类定义了两个伴随算法,可以在未初始化内存中创建对象:
    allocator的算法
    uninitialized_copy(b, e, b2) 从迭代器b和3
    指出的输入范围中拷贝元素到迭代器b2指定的未构造的原始内存中,b2指向的内存必须足够大,能容下输入序列中的元素的拷贝
    uninitialized_copy_n(b, n, b2) 从迭代器b指向的元素开始,拷贝n个元素到b2开始的原始内存中
    uninitialized_fill(b, e, t) 在迭代器b和e指定的原始内存范围中创建对象,值均为t的拷贝
    uninitialized_fill_n(b, n, t) 从迭代器b指向的原始内存地址开始创建n个对象,b必须指向足够大的未构造的原始内存,能容纳给定数量的对象

    这些函数在给定目的位置创建元素,而不是由系统分配内存给他们。


    vector<int> vec{0, 1, 2, 3, 4, 5};
    auto p = alloc.allocate(vec.size() * 2);
    auto q = uninitialized_copy(vec.begin(), vec.end(), p);
    
    uninitialize_fill_n(q, vec.size(), 42);


    uninitialized_copy在给定位置构造元素,函数返回递增后的目的位置迭代器。因此,一个uninitialized_copy调用会返回一个指针,指向最后一个构造的元素之后的位置



  • 相关阅读:
    液晶电子看板
    车间电子看板厂家
    车间电子看板系统
    Andon系统有哪些类型?
    Andon系统最完整的介绍
    Andon系统一般架构
    生产看板管理系统
    车间看板系统
    生产管理看板介绍
    黑马Java2020在线就业班2.1-全新升级
  • 原文地址:https://www.cnblogs.com/averson/p/5096058.html
Copyright © 2011-2022 走看看