假设我有一个类需要调用复制构造函数来制作正确的副本:
struct CWeird
{
CWeird() { number = 47; target = &number; }
CWeird(const CWeird &other) : number(other.number), target(&number) { }
const CWeird& operator=(const CWeird &w) { number = w.number; return *this; }
void output()
{
printf("%d %d\n", *target, number);
}
int *target, number;
};
现在的问题是 CArray 在重新分配内存时不会在其元素上调用复制构造函数(只有从旧内存到新内存的 memcpy),例如这段代码
CArray<CWeird> a;
a.SetSize(1);
a[0].output();
a.SetSize(2);
a[0].output();
结果是
47 47
-572662307 47
我不明白这个。为什么 std::vector 可以正确复制相同的对象而 CArray 不能?这里有什么教训?我应该只使用不需要显式复制构造函数的类吗?或者将 CArray 用于任何严重的事情是一个坏主意?