C/C++ 结构体赋值:深拷贝 vs. 浅拷贝详解
"在C/C++中,结构体之间的赋值操作默认是浅拷贝。也就是说,当使用"="运算符将一个结构体赋值给另一个结构体时,只会将结构体中的成员逐个复制过去,如果结构体中包含指针类型的成员,那么只会复制指针的值,而不会复制指针指向的内存区域。\n\n如果需要进行深拷贝,即复制指针指向的内存区域,需要手动编写代码实现。可以通过使用函数来实现深拷贝,或者通过重载"="运算符来实现。\n\n以下是一个示例代码,展示如何实现结构体的深拷贝:\n\nc++\n#include <iostream>\n#include <cstring>\n\nstruct Person\n{\n char* name;\n int age;\n};\n\nvoid deepCopy(Person& dest, const Person& src)\n{\n dest.age = src.age;\n dest.name = new char[strlen(src.name) + 1];\n strcpy(dest.name, src.name);\n}\n\nPerson& operator=(Person& dest, const Person& src)\n{\n if (&dest != &src)\n {\n delete[] dest.name;\n dest.age = src.age;\n dest.name = new char[strlen(src.name) + 1];\n strcpy(dest.name, src.name);\n }\n return dest;\n}\n\nint main()\n{\n Person p1;\n p1.age = 20;\n p1.name = new char[10];\n strcpy(p1.name, \"Alice\");\n\n Person p2;\n deepCopy(p2, p1);\n\n Person p3 = p1;\n p3.age = 25;\n\n Person p4;\n p4 = p1;\n\n // 输出结果\n std::cout << p1.name << \" \" << p1.age << std::endl; // Alice 20\n std::cout << p2.name << \" \" << p2.age << std::endl; // Alice 20\n std::cout << p3.name << \" \" << p3.age << std::endl; // Alice 25\n std::cout << p4.name << \" \" << p4.age << std::endl; // Alice 20\n\n delete[] p1.name;\n delete[] p2.name;\n delete[] p3.name;\n delete[] p4.name;\n\n return 0;\n}\n\n\n在上述代码中,使用了一个deepCopy函数来实现深拷贝,以及重载了"="运算符来实现深拷贝。在进行结构体赋值时,会先释放目标结构体中的内存,然后再进行深拷贝操作。这样,每个结构体都有自己独立的内存空间,互不影响。\n
原文地址: https://www.cveoy.top/t/topic/quZx 著作权归作者所有。请勿转载和采集!