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