与带有指针项的矢量复制相关的问题
issues related to the copy of vector with pointer item
我想问一下指针项向量的复制是否存在一些问题。我是否需要进行结构或内存,因为可能存在深度复制问题?
例如:
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
定义复制构造函数,以确保正确处理您询问的问题(尽管不是通过使用memcpy
或strcpy
)。 在这里始终遵循三个规则。 我很确定std::vector
你的好处,但如果不是,那就使用 for
循环而不是memcpy
- 关于复制构造函数的一个棘手问题
- 复制构造函数隐式转换问题
- 将文件复制到自定义位置,存在字符串转换问题
- 在 boost::variant 中类 holden 的复制构造函数存在问题
- 使用 Libssh 将文件从服务器复制到客户端:分配文件复制目标路径时出现问题
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 复制和赋值构造函数的问题
- 使用SSE内部函数复制少量数据时出现问题
- 错误 C2280 / 在 std::vector 中实例化对象时复制构造函数出现问题?
- 创建 std::set 只复制一个元素,如何解决这个问题?
- 将值复制到多维数组时出现问题
- 复制到新阵列时出现动态内存分配问题
- 使用 C++ 中的指针将一个数组复制到另一个数组时出现问题
- 关于QLIST类型实例复制构造函数的一个奇怪问题
- 原始二进制树删除与复制问题(改进解释)
- 在我的链接列表中复制问题
- 使用VS2008编译的C/C++中存在结构复制问题
- 覆盖运算符 =,以便我们可以使用 = 复制类实例,而不会有浅层复制问题
- Cuda:固定内存零复制问题
- 返回值复制问题(以改进调试时间)-- 这里的解决方案是什么?