这是我以前从未做过的事情,想知道应该使用什么适当的方法
如果您有一个琐碎的对象,例如:
struct simple_object {
int i;
};
在您的应用程序中,您创建了以下形式的这些对象的数组:
simple_object *array = new simple_object[10];
我知道c ++的默认行为是分配数组并在每个对象上调用此类的默认构造函数,类似地,析构函数将在for的每个对象上调用delete [] array
。
当您想增加数组的大小时,会出现问题。例如,如果您想将数组的大小加倍,则可以执行以下操作:
simple_object *temp = new simple_object[20];
memcpy(temp, array, sizeof (simple_object) * 10);
delete [] array;
array = temp;
但是我认为这很危险,甚至可能无法正常工作(在更复杂的对象的析构函数中可能会发生一些冲突)。另一种选择是:
simple_object *temp = new simple_object[20];
for (i to 10)
{
temp[i] = array[i];
}
delete [] array;
array = temp;
这样,数组中的每个元素都是默认构造的,并且每个对象的副本构造函数都将直接调用。这是复制对象数组的正确方法还是其他更标准的方法?
我知道标准的选择是使用向量并利用其调整大小功能,但我希望能更好地理解复制对象数组的正确操作是什么,而不是样板的答案
如果您坚持要这样做,那么您可能应该这样std::vector
做。它使用operator new
(通过分配器)分配原始内存。然后,它用于placement new
在该内存中创建项目。
当需要移动对象时,它将按优先级使用移动分配/构造。如果不可用,它将进行复制,然后销毁旧的。
无论哪种方式,它都不会像数组那样默认构造对象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句