Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在预先分配的内存中创建对象_C++_Arrays_Memory Management - Fatal编程技术网

C++ 在预先分配的内存中创建对象

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 我在预先分配的缓冲区中创建了两个对象。这两个对象是在缓冲区内随机创建的还是在连续内存块中创建的?

我们可以使用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();