allocator类使用简介

现有Person类:

#include <iostream>


class Person {
public:
    Person() : age_(0) {
        std::cout << "Invoking Person()" << std::endl;
    }
    Person(std::string name, const size_t age, std::string sex) :
            name_(std::move(name)), age_(age), sex_(std::move(sex)) {
        std::cout << "Invoking Person(std::string, const size_t, std::string)" << std::endl;
    }
    ~Person() {
        std::cout << "Invoking ~Person()" << std::endl;
    }
private:
    std::string name_;
    size_t age_;
    std::string sex_;
};

如果直接使用new创建Person数组则会执行默认初始化:

Person* p = new Person[5];

程序输出:

Invoking Person()
Invoking Person()
Invoking Person()
Invoking Person()
Invoking Person()

如何避免这种情况发生呢?这就要用到allocator了。

allocator在头文件memory.h中,使用allocator必须分为如下几个步骤:

(1)实例化

(2)调用allocate方法申请内存

(3)调用construct方法构造对象

(4)调用destory方法析构对象

(5)调用deallocate回收内存

std::allocator<Person> alloc;  // 实例化
Person* p = alloc.allocate(5);  // 申请内存
for (size_t i=0; i!=5; ++i) {
    alloc.construct(p+i, std::string("Person")+std::to_string(i), 18, "male");  // 构造对象
}
for (size_t i=0; i!=5; ++i) {
    alloc.destroy(p + i);  // 析构对象
}
alloc.deallocate(p, 5);  // 回收内存

程序输出:

Invoking Person(std::string, const size_t, std::string)
Invoking Person(std::string, const size_t, std::string)
Invoking Person(std::string, const size_t, std::string)
Invoking Person(std::string, const size_t, std::string)
Invoking Person(std::string, const size_t, std::string)
Invoking ~Person()
Invoking ~Person()
Invoking ~Person()
Invoking ~Person()
Invoking ~Person()
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、简述 C++的STL中定义了很多容器,容器的第二个模板参数通常为allocator类型,于是想对这一类型做个透...
    扎Zn了老Fe阅读 678评论 0 1
  • 配置器 空间适配器的标准接口 内存分配释放与构造析构 为了精密分工,STL allocator决定将这两阶段操作区...
    VictorHong阅读 581评论 0 0
  • #1.动态内存与智能指针1.1 shared_ptr类1.2 直接管理内存1.3 shared_ptr和new结合...
    MrDecoder阅读 526评论 0 4
  • 静态内存、栈内存和堆 我们前面只提到了静态内存或栈内存: 静态内存:用来保存局部static、类static数据成...
    TOMOCAT阅读 303评论 0 1
  • 4.高级主题 4.1 标准库特殊设施 tuple类型希望将一些数据合成单一对象,但又不想麻烦地定义一个新数据结构来...
    王侦阅读 738评论 0 0