【问题标题】:Structure deep copy结构深拷贝
【发布时间】:2011-08-31 11:40:35
【问题描述】:

这可能是一个非常基本的问题,但不知何故它让我上当了……当我编写测试代码时,它似乎可以工作,但在生产中出现了问题。

// 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++编译器编译有关系吗?

【问题讨论】:

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

标签: c++ structure deep-copy


【解决方案1】:

深拷贝只会受到指针的阻碍,因此您的 struct 将在 C 中正确复制。它也可以在 C++ 中工作,除非您定义自己的 operator= 正确复制。您只需为带有指针的类型定义operator=,因为指针的浅拷贝将复制指针但共享数据。

【讨论】:

    【解决方案2】:

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

    这将是一个浅拷贝。

    如果对象包含指针t1t2,每个都包含一些间接的、动态分配的内存块的位置,那么您需要一个深拷贝。

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多