C++ 在预先分配的内存中创建对象
我们可以使用placement new在预先分配的内存中创建对象 我们考虑下面的例子:C++ 在预先分配的内存中创建对象,c++,arrays,memory-management,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 我在预先分配的缓冲区中创建了两个对象。这两个对象是在缓冲区内随机创建的还是在连续内存块中创建的?
char *buf = new char[1000]; //pre-allocated buffer
string *p = new (buf) MyObject(); //placement new
string *q = new (buf) MyObject(); //placement new
我在预先分配的缓冲区中创建了两个对象。这两个对象是在缓冲区内随机创建的还是在连续内存块中创建的?如果我们继续在缓冲区中创建更多的对象,并希望它们存储在连续的内存块中,我们应该怎么做?首先在缓冲区中创建一个数组,然后在数组的元素槽中创建每个对象?这两个对象都是在相同的内存位置创建的,即
buf
。这是未定义的行为(除非对象是POD)
如果要分配多个对象,必须增加指针,例如buf+n*sizeof(MyObject)
,但要注意对齐问题
完成后也不要忘记调用析构函数。以下代码行:
string *p = new(adr) MyObject();
将在地址adr处创建MyObject对象。然后,下次创建另一个对象时,您将知道第一个对象正在使用adr处的内存,因此必须在adr+sizeof(MyObject)
处创建下一个对象:
预先分配内存的意义在于,您不会在运行时进行分配,这相当缓慢。你在循环/程序开始时做一个大的分配,然后你只需要使用分配的块。缺点是你必须管理你自己的内存,这意味着你必须弄清楚把你的对象放在哪里,这在你的内存池变得支离破碎时会变得很棘手 由于缓冲区是用
new
分配的,因此它具有支持任何类型(包括数组)的对齐方式。(并不是说你总体上错了,只是在这种情况下他是安全的。)@GMan:谢谢,说得好。我想如果你想把不同类型的对象放在内存中,需要特别注意。“普通的旧数据”,即基本类型,或POD数组,或没有构造函数的类,等等,只包含POD。任何由其二进制表示形式单独确定并可被memcopy的内容。“如果我们在缓冲区中不断创建更多对象,并希望它们存储在连续的内存块中,我们该怎么办?”使用std::vector
,它是一个连续存储的动态数组。如果adr=static\u cast(byteaddr),那么您将执行以下操作:string*q=new(adr+1)MyObject();
string *q = new(adr + sizeof(MyObject)) MyObject();