0

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

4

3 回答 3

2

想一想,如果在调用value 之后setB从向量中删除和删除一个项目,那么向量 inA将有一个不再有效的指针。

所以要么你需要做一个“深拷贝”,保证上述情况永远不会发生,要么使用共享智能指针std::shared_ptr而不是原始指针。如果您需要指针,我会推荐最后一个。

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

于 2012-08-15T03:59:17.957 回答
1

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

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

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

如果您希望稍后引用元素,另一种选择是简单地将指针复制到向量。只是要小心正确地管理生命周期!

我希望这会有所帮助!

于 2012-08-15T03:59:58.350 回答
1

您可能希望定义您的复制构造函数,class A以确保正确处理您询问的问题(尽管不是通过使用memcpyor strcpy)。在这里始终遵循三原则。我很确定std::vector你的好,但如果不是,那么使用for循环而不是memcpy

于 2012-08-15T04:17:09.967 回答