【问题标题】:Deep copy structure C++深拷贝结构 C++
【发布时间】:2015-10-29 19:55:57
【问题描述】:

我正在尝试为我的结构构建一个深拷贝功能。在主程序中,我尝试将 a 深度复制到 c 中,所以最后它应该打印字符串“B”。我究竟做错了什么?我知道我现在缺少一些晦涩的指针。

#include <iostream>

using namespace std;

struct Thing {

        size_t length;
        std::string txt;
        struct Thing *things[];
};

struct Thing *deepCopy(struct Thing *origin) {

        Thing tmp;
        tmp.length = origin->length;
        for(int i=0;i<tmp.length; ++i)
            tmp.things[i] = deepCopy(origin->things[i]);

        return &tmp;
}

int main() {

        Thing a, b, *c;

        a.length = 1;
        a.things[0] = &b;
        a.txt = "A";
        b.txt = "B";
        b.length = 0;
        c = deepCopy(&a);

        cout<<c->txt;
        return 0;
}

【问题讨论】:

  • 启用所有警告,问题就会很明显(在 gcc 中是-Wall)。将来会对您有所帮助。
  • C++ 和 C 的完美结合!
  • 除了已经提到的本地参数地址之外,这里还有一个未定义的行为struct Thing *things[];

标签: c++ object deep-copy


【解决方案1】:

执行深拷贝的最佳方法是编写代码,以便编译器为您完成。编译器会自动生成一个复制构造函数和赋值运算符来复制对象的每个成员。只要每个成员都知道如何复制自己,这通常会按照您想要的方式工作。如果您有指针和手动管理的内存,它可能不会自动工作,因为指针不知道它们是否拥有它们所指向的内容。如果你不使用任何指针,你通常没问题。

所以如果你这样写你的对象:

struct Thing
{
    std::string txt;
    std::vector<Thing> things;
};

复制它会自动工作。

Thing a;
Thing b = a; // just works

我删除了 size 字段,因为std::vector 知道它自己的大小,所以不需要它。

【讨论】:

  • 终于有正确答案了:)
  • 事实是我需要该结构:) 我需要实现深拷贝功能..
  • @user5504743 给你这个结构的人不擅长编程。
【解决方案2】:

你不能返回局部变量的地址。在功能完成的那一刻,它不再有效。将两个指针(源和目标)传递给函数

【讨论】:

    【解决方案3】:

    您正在返回一个指向具有自动存储持续时间的对象的指针,因为在控制离开函数范围后,该对象处于不确定状态,使用 c 取消引用它是未定义的行为。要么返回对象的完整副本,然后获取其地址并将其放入 c,要么将指向 c 的引用或指针传递给函数(或使 deepCopy 成为 Thing 的成员函数并分配给实例而不是临时的,这可能是最好的解决方案)。

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 1970-01-01
      • 2022-01-15
      • 2012-07-05
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2010-12-16
      相关资源
      最近更新 更多