我想问一下指针项向量的副本是否存在问题。我是否需要strcpy或memcpy,因为可能存在深度复制问题?
例如:
Class B;
Class A
{
....
private:
std::vector<B*> bvec;
public:
void setB(std::vector<B*>& value)
{
this->bvec = value;
}
};
void main()
{
....
std::vector<const B*> value; // and already has values
A a;
a.setB(value);
}
此示例仅将值分配给A类中的类变量bvec。我是否需要使用memcpy,因为我发现std :: vector bvec;有指针项吗?我对C ++中的深度复制感到困惑,你能说清楚吗?谢谢。
答案 0 :(得分:2)
考虑一下,如果您在后调用value
后从矢量setB
中删除并删除某个项目,那么A
中的矢量将会有一个指针不再有效。
因此,您需要执行“深层复制”,保证上述场景永远不会发生,或使用共享智能指针(如std::shared_ptr
而不是原始指针)。如果你需要指针,我会推荐最后一个。
还有另一种选择,那就是将矢量存储在A
中作为真实矢量的参考。但是,这还有其他问题,例如真实矢量需要在对象的生命周期内有效。但是在这里你也可以使用智能指针,并动态分配矢量。
答案 1 :(得分:1)
您不太可能需要strcpy或memcpy来解决您的问题。但是,我不确定你的问题是什么。
我将尝试解释与std :: vector相关的复制。
将bvev分配给setB中的值时,您正在进行深层复制。这意味着向量中的所有元素都会从值复制到bvec。如果有对象矢量,则复制每个对象。如果你有一个指针向量,每个指针都会被复制。
如果您希望稍后引用这些元素,则可以简单地将指针复制到向量。要小心妥善管理生命周期!
我希望有所帮助!
答案 2 :(得分:1)
您可能希望为class A
定义复制构造函数,以确保正确处理您的询问问题(尽管不是使用memcpy
或strcpy
)。这里始终遵循三条规则。我非常确定std::vector
您的好处,但如果没有,请使用for
循环代替memcpy