我们可以使用placement new在预先分配的内存中创建一个对象。
让我们考虑以下示例:
char *buf = new char[1000]; //pre-allocated buffer
string *p = new (buf) MyObject(); //placement new
string *q = new (buf) MyObject(); //placement new
我在预先分配的缓冲区中创建了两个对象。这两个对象是在缓冲区中随机创建的还是在连续的内存块中创建的?如果我们继续在缓冲区中创建更多对象并希望它们存储在连续的内存块中,我们该怎么办?首先在缓冲区中创建一个数组,然后在数组的元素槽中创建每个对象?
答案 0 :(得分:5)
这两个对象都在同一个内存位置创建,即buf
。这是未定义的行为(除非对象是POD)。
如果要分配多个对象,则必须增加指针,例如buf + n * sizeof(MyObject)
,但要注意对齐问题
也不要忘记在完成后调用析构函数。
答案 1 :(得分:3)
以下代码行:
string *p = new(adr) MyObject();
将在地址adr处创建一个MyObject对象。然后,下次创建另一个对象时,您将知道第一个对象正在使用adr的内存,因此必须在adr + sizeof(MyObject)
创建下一个对象:
string *q = new(adr + sizeof(MyObject)) MyObject();
预分配内存的要点是你没有在运行时分配,这很慢。你在循环/程序的开头做了一个大的分配,然后你只需要使用那个分配的块。缺点是你必须管理你自己的内存,这意味着当你的内存池碎片化时你必须弄清楚你的对象放在哪里变得棘手!