现有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()