与带有指针项的矢量复制相关的问题

issues related to the copy of vector with pointer item

本文关键字:复制 问题 指针      更新时间:2023-10-16

我想问一下指针项向量的复制是否存在一些问题。我是否需要进行结构或内存,因为可能存在深度复制问题?

例如:

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++中的深度副本感到困惑,你能告诉我清楚吗?谢谢。

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

因此,要么你需要做一个"深度复制",保证上述场景永远不会发生,要么使用像std::shared_ptr这样的共享智能指针而不是原始指针。如果您需要指针,我会推荐最后一个。

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

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

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

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

另一种选择是,如果您希望稍后引用元素,只需将指针复制到矢量。 只要小心正确管理寿命!

我希望这有所帮助!

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