在指定内存位置创建对象

作为一门允许程序员自己操作内存的语言, C++ 提供了三种方式在指定的内存位置创建对象.

而为什么要在指定位置创建对象呢?作用有三:

  1. 预先足够的分配内存,以便减少使用中分配内存的操作.
  2. 重复利用内存,减少内存碎片.
  3. 方便进行细粒度管理.

实现这个需求的方式有三种.

在接下来的文章中,我们使用如下类作为示例.

class Person {
private:
int age;
std::string name;

public:
int get_age() { return age; }
bool set_age(int a) {
age = a;
return true;
}
std::string get_name() { return name; }
bool set_name(std::string &s) {
name = s;
return true;
}
}

Placement new

首先分配足够大的内存, 然后在使用 new 关键字时穿入指向内存首字节的指针.

char mem[sizeof(Person)];
Person *p = new(mem) Person(); // Placement new
p->set_age(8);
p->set_name(*new std::string("memory!"));

注意:

  1. 分配的内存必须能装下对象.
  2. 指向内存的指针必须对齐.
  3. 显式调用析构函数销毁对象.

Operator new

因为使用 new 的时候会先调用 operator new(然后调用类构造函数), 可以通过重载它返回已分配的内存指针.

其原型为:
void * operator new (size_t sz)

但是这样需要指针是全局的.......

allocator

可以使用 c++ 官方 <memory> 库中的 allocator 来做这件事. allocator 定义了分配和回收内存,创建和销毁内存上的对象等操作.

std::allocator<Person> alloc;
Person *d = alloc.allocate(1);
alloc.construct(d);
// Some operations
alloc.destroy(d);
alloc.deallocate(d, 1);

引用

C++ 在指定内存构造对象