Examples of C and C++ shallow copy and deep copy
- 2020-05-27 06:45:40
- OfStack
Examples of C/C++ shallow copy and deep copy
Deep copy refers to the specific content of the copy object, and the memory address is allocated autonomously, after the copy is over, although the two objects save the same value, but the memory address is not the same, the two objects do not affect each other, do not interfere with each other.
Shallow copy is a copy of the memory address, so that the target object pointer and the source object point to the same piece of memory space.
Shallow copy is just a simple copy of the object, let several objects share a piece of memory, when the memory is destroyed, several Pointers to this piece of memory need to be redefined can be used, otherwise it will become wild pointer.
Shallow and deep copies are also involved in iOS development. In short:
Shallow copy: copies the value of the pointer variable
Deep copy: copies the pointer to the memory space
But this time we did it with C:
// The statement 1 A structure
typedef struct Person {
char name[20];
int age;
char *alias;
}Person;
// Copy the method
void copyPerson(Person *from, Person *to){
*to = *from;
}
//main function
int main(int argc, const char * argv[]) {
Person p1;
p1.age = 11;
strcpy(p1.name, "royce");
p1.alias = "owen";
Person p2;
copyPerson(&p1, &p2);
printf("p2:%p p1:%p\np2-alias:%p p1-alias:%p\n",&p2,&p1,p2.alias,p1.alias);
return 0;
}
// print
p2-alias:0x100000f80 p1-alias:0x100000f80
We found that alias of p1 and alias of p2 point to the same block of memory space, and the compiler = sign assigns the default shallow copy
Implement deep copy
void copyPerson(Person *from, Person *to){
*to = *from;
to->alias = (char *)malloc(100);
strcpy(to->alias, from->alias);
}
// print
p2-alias:0x1003069a0 p1-alias:0x100000f82
We allocated memory to the alias override of p2 and then copied alias of p1
If you have any questions, please leave a message or come to the site community to exchange discussion, thank you for reading, hope to help you, thank you for your support of the site!