C++ 深度复制结构C++;

C++ 深度复制结构C++;,c++,object,deep-copy,C++,Object,Deep Copy,我正在尝试为我的结构构建一个深度复制函数。在主程序中,我尝试将a深度复制到c中,所以最后它应该打印字符串“B”。我做错了什么?我知道我现在缺少一些晦涩难懂的指针 #include <iostream> using namespace std; struct Thing { size_t length; std::string txt; struct Thing *things[]; }; struct Thing *deepCo

我正在尝试为我的结构构建一个深度复制函数。在主程序中,我尝试将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;
}
#包括
使用名称空间std;
结构物{
尺寸与长度;
std::string-txt;
结构对象*对象[];
};
结构物*深度复制(结构物*原点){
事物tmp;
tmp.length=原点->长度;
对于(整数i=0;整数[i]);
返回&tmp;
}
int main(){
事物a,b,*c;
a、 长度=1;
a、 事物[0]=&b;
a、 txt=“a”;
b、 txt=“b”;
b、 长度=0;
c=深度复制(&a);

cout无法返回局部变量的地址。函数完成时,它不再有效。传递两个指针(源和目标)要改为运行

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

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

因此,如果您这样编写对象:

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

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

启用所有警告,问题就会很明显(在gcc中是
-Wall
)这将对你有帮助。C++和C是一个不公平的混合体,除了已经提到的局部参数地址之外,这里还有一个未定义的行为:
最后一个正确的答案:)事实是我需要这个结构:)我需要实现深度复制功能..@user5504743给你这个结构的人不擅长编程。
Thing a;
Thing b = a; // just works