我想实现自己的简单向量类。即使保留内存已用尽,此向量也应支持推送新元素(T
类型)。因此,我需要分配一个新的内存块,将元素复制到其中,然后释放旧的内存块。
如果我使用new T[]
创建一个内存块,则必须使用delete[]
释放它,这将使向量中每个元素的构造函数都被调用。我不想这么做,因为我想只使用memcpy()
复制旧向量。
因此,我决定使用new char[]
分配内存,并使用 placement new 填充数组。当我需要重新分配保留的内存时,只需在该内存块上使用memcpy()
,然后使用delete[]
释放它即可。
这是一个合理的解决方案吗?
答案 0 :(得分:6)
只有某些对象应该(如允许)通过memcpy
“复制”。这些称为trivial types-不能具有自定义析构函数。
因此,使用memcpy
避免调用析构函数是矛盾的。仅在不需要后者时才允许您这样做。
考虑一下:通常,T
可能具有指向其自身成员(或同一向量中其他T
的指针)的引用。如果使用memcpy
移动这些对象,则这些对象将继续引用旧的(现在无效)的存储位置。这正是T
的构造函数和析构函数必须处理的(如果甚至允许复制/移动它们),因此省略它们将导致问题。