gpt4 book ai didi

c++ - 这个复制构造函数是个坏主意吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:19 24 4
gpt4 key购买 nike

所以,我觉得这是个坏主意:

class Foo
{
public:
Foo(const Foo& from)
{
memcpy(this, &from, sizeof(Foo));

m_someData = new int[m_dataLength];
memcpy(m_someData, from.m_someData, m_dataLength * sizeof(int));
}

private:
int* m_someData;
int m_dataLength;

};

问题是:为什么?如果memcpy参数类型(和大小)相同,布局相同,哪里不好?

我看到的一个潜在问题是是否存在 stringvector<>字段,但我不确定这是否是一个有效的问题。

最佳答案

如果Foo可以派生自,考虑当你有一个 Bar 时会发生什么派生自 Foo 的类, 并复制构建一个 Foo来自那个Bar实例。

如果你有任何虚拟方法,你的 sizeof(Foo)包括编译器为实现虚拟方法(即 vtable)而添加的任何信息,您绝对不想复制这些信息。

如果你没有任何虚拟方法,但是Bar添加一个字段到 Foo ,那么你还有一个潜在的问题:该字段可以存储在 Foo 的填充字节中。 .他们会被 memcpy 破坏.

最后:

One potential issue I see is if there is a string or vector<> field, but I'm not sure if that's a valid concern.

为什么不呢?它显然会破裂,而且会破裂得很厉害。


您可以通过使用默认自动生成的复制构造函数来避免这个问题。如果您想为其添加逻辑,而不是被迫提及要复制的所有字段,请使用隐藏的数据容器:

class Foo
{
public:
Foo(const Foo& from)
{
m_Data = from.m_Data;

m_Data.m_someData = new int[m_Data.m_dataLength];
memcpy(m_Data.m_someData, from.m_Data.m_someData, m_Data.m_dataLength * sizeof(int));
}

private:
struct Data {
int* m_someData;
int m_dataLength;
// more fields
};
Data m_Data;

};

注意如何 m_Data = from.m_Data;这里有你试图用 memcpy 实现的确切效果, 除了它安全地进行。

关于c++ - 这个复制构造函数是个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33260572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com