自己的自定义向量类。内存重新分配

时间:2018-09-24 12:56:05

标签: c++ memory vector memory-management

我想实现自己的简单向量类。即使保留内存已用尽,此向量也应支持推送新元素(T类型)。因此,我需要分配一个新的内存块,将元素复制到其中,然后释放旧的内存块。

如果我使用new T[]创建一个内存块,则必须使用delete[]释放它,这将使向量中每个元素的构造函数都被调用。我不想这么做,因为我想只使用memcpy()复制旧向量。

因此,我决定使用new char[]分配内存,并使用 placement new 填充数组。当我需要重新分配保留的内存时,只需在该内存块上使用memcpy(),然后使用delete[]释放它即可。

这是一个合理的解决方案吗?

1 个答案:

答案 0 :(得分:6)

只有某些对象应该(如允许)通过memcpy“复制”。这些称为trivial types-不能具有自定义析构函数。

因此,使用memcpy避免调用析构函数是矛盾的。仅在不需要后者时才允许您这样做。

考虑一下:通常,T可能具有指向其自身成员(或同一向量中其他T的指针)的引用。如果使用memcpy移动这些对象,则这些对象将继续引用旧的(现在无效)的存储位置。这正是T的构造函数和析构函数必须处理的(如果甚至允许复制/移动它们),因此省略它们将导致问题。