问题 结构深拷贝


这可能是一个非常基本的问题,但不知怎的,它让我受骗......当我编写测试代码时,它似乎有效,但生产中出现了问题。

// Header file
#define length 100
typedef struct testStr_t {
    int a;
    char b;
    char t1[length];
    char t2[length];
} test;

void populateTest(test*);

// source file
test test1;
test test2;
populateTest(&test1);
test2 = test1;

test2 是一份深刻的副本 test1?或者有问题吗?如果代码是用C编译器或C ++编译器编译的,那有关系吗?


8262
2018-05-23 21:24


起源

在C ++中,没有任何深度与浅层复制的概念。一切都是价值,价值只是被复制。 - jalf
@jalf:嗯?有 绝对 深刻与浅色复制的概念。好的,不是语言,如果你是明智的并且使用RAII则不行;但是虽然 需要做出区分 可以避免,这绝不意味着没有。 - Lightness Races in Orbit
我和贾尔夫在这里。而深刻与浅薄或(可能是中等?)的想法总是让我觉得荒谬可笑。不同的概念可能适用于smalltalk(但我认为ST从未流行的原因之一是你必须考虑这些事情),但它不适用于C ++ - 副本是副本。 - Neil Butterworth
@Chris那么我们应该强加一下UFO的概念吗?有些东西(比如迭代器)很适合C ++的做事方式,有些东西(比如深层/浅层复制)则不适合。 - Neil Butterworth
浅拷贝与深拷贝是C ++中错误的二分法。只有“正确复制”,“损坏的复制代码”和“不可复制”。添加数据成员可能会破坏某些方法(例如copy ctor和op =),但是 添加数据成员总是可以破坏这些方法 (包括默认的ctor,析构函数等)。 - Fred Nurk


答案:


深拷贝只会被指针阻碍,所以你的 struct 将在C中正确复制。除非你定义自己的,否则它也适用于C ++ operator= 那  正确复制。你只需要定义 operator= 对于带指针的类型,因为指针的浅表副本将复制指针但共享数据。


10
2018-05-23 21:31





我的答案与C ++有关。我只能猜测它仍然适合C.

这将是一个浅薄的副本。

如果包含对象 指针  t1 和 t2,每个都包含一些间接的,动态分配的内存块的位置,你需要一个深层复制。

但是,对象包含实际数组时间的直接对象,因此您可以使用浅复制。

(这有点误导,这是有效的,但你不能自己手动分配给数组对象!)


3
2018-05-23 21:31