这是我以前没做过的事情,想知道应该采用什么样的方法
如果您有一个简单的对象,例如:
struct simple_object {
int i;
};
在您的应用程序中,您创建了以下形式的这些对象的数组:
simple_object *array = new simple_object[10];
我知道c ++的默认行为是分配数组并在每个对象上调用此类的默认构造函数,类似地,析构函数将在每个对象上调用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;
这样,数组中的每个元素都是默认构造的,并且直接调用每个对象的复制构造函数。这是复制对象数组的正确方法还是有其他更标准的方法来做到这一点?
我知道标准选项是使用向量并利用它的大小调整功能但不是样板答案我想更好地理解复制对象数组的正确操作应该是什么
答案 0 :(得分:1)
如果你坚持这样做,你应该像std::vector
那样做。它使用operator new
(通过分配器)分配原始内存。然后它使用placement new
在该内存中创建项目。
当需要移动对象时,它将优先使用移动分配/构造。如果它不可用,它将复制然后销毁旧的。
无论哪种方式,它都不会像数组一样获得默认的构造对象。
答案 1 :(得分:0)
使用(动态长度)原始数组,您可以使用std::copy
复制项目。它等同于使用循环,除了它可以针对可以安全地调用例如它的情况进行优化。 memcpy
做这项工作。即,安全,高效的地方。
您还可以使用std::move
algorithm从要删除的阵列中移动项目。我对那里的异常安全问题不太了解,也就是说,如果发生异常事件,那么该怎么办呢。我认为从中恢复是相当困难的,但我没有使用过这个,即我没有深入研究它,真的,所以这只是我的印象。
但是使用std::vector
代替原始数组要简单得多。
它负责内存管理和复制。