与指针项的向量副本相关的问题

时间:2012-08-15 03:54:11

标签: c++ copy depth

我想问一下指针项向量的副本是否存在问题。我是否需要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 ++中的深度复制感到困惑,你能说清楚吗?谢谢。

3 个答案:

答案 0 :(得分:2)

考虑一下,如果您在后调用value后从矢量setB 中删除并删除某个项目,那么A中的矢量将会有一个指针不再有效。

因此,您需要执行“深层复制”,保证上述场景永远不会发生,或使用共享智能指针(如std::shared_ptr而不是原始指针)。如果你需要指针,我会推荐最后一个。

还有另一种选择,那就是将矢量存储在A中作为真实矢量的参考。但是,这还有其他问题,例如真实矢量需要在对象的生命周期内有效。但是在这里你也可以使用智能指针,并动态分配矢量。

答案 1 :(得分:1)

您不太可能需要strcpy或memcpy来解决您的问题。但是,我不确定你的问题是什么。

我将尝试解释与std :: vector相关的复制。

将bvev分配给setB中的值时,您正在进行深层复制。这意味着向量中的所有元素都会从值复制到bvec。如果有对象矢量,则复制​​每个对象。如果你有一个指针向量,每个指针都会被复制。

如果您希望稍后引用这些元素,则可以简单地将指针复制到向量。要小心妥善管理生命周期!

我希望有所帮助!

答案 2 :(得分:1)

您可能希望为class A定义复制构造函数,以确保正确处理您的询问问题(尽管不是使用memcpystrcpy)。这里始终遵循三条规则。我非常确定std::vector您的好处,但如果没有,请使用for循环代替memcpy