深拷貝與淺拷貝
在存在指針指向堆區(qū),然后指針傳值柏腻,就會(huì)有兩個(gè)指針變量指向同一塊堆區(qū)內(nèi)存纸厉,這就是淺拷貝。此時(shí)如果這兩個(gè)指針變量同時(shí)free五嫂,就會(huì)出現(xiàn)錯(cuò)誤颗品,同一塊堆區(qū)內(nèi)存不允許free兩次,結(jié)果會(huì)不可預(yù)測(cè)沃缘。就需要深拷貝的出現(xiàn)躯枢,在兩個(gè)指針傳值時(shí),可以再手動(dòng)開(kāi)辟一塊內(nèi)存槐臀,將里面的數(shù)據(jù)復(fù)制新的堆區(qū)內(nèi)存锄蹂,新的指針指向這個(gè)新開(kāi)辟的堆區(qū)內(nèi)存,兩個(gè)變量同時(shí)free就不會(huì)出現(xiàn)錯(cuò)誤水慨。
淺拷貝
//創(chuàng)建結(jié)構(gòu)體
typedef struct student
{
int age;
char *name;
}student;
int main()
{
student s1;
//動(dòng)態(tài)開(kāi)辟內(nèi)存
s1.name = (char*)malloc(sizeof(char)*20);
strcpy(s1.name,"TOM");
//淺拷貝
student s2 = s1;
free(s1.name);
free(s2.name);
return 0;
}
兩次free同一塊堆區(qū)內(nèi)存時(shí)得糜,第一次free后,該堆區(qū)內(nèi)存變成自由的晰洒〕叮可以被程序開(kāi)辟動(dòng)態(tài)內(nèi)存。此時(shí)如果有程序開(kāi)辟動(dòng)態(tài)內(nèi)存谍珊,地址剛好是這個(gè)地址槽棍。然后free(s2.name),就會(huì)造成不可預(yù)測(cè)的錯(cuò)誤。
深拷貝
typedef struct student
{
int age;
char *name;
}student;
int main()
{
student s1;
s1.name = (char*)malloc(sizeof(char)*20);
strcpy(s1.name,"TOM");
student s2 = s1;
//深拷貝
s2.name = (char*)malloc(sizeof(char)*20);
strcpy(s2.name,s1.name);
free(s1.name);
//free后炼七,最好將地址賦值為NULL
s1.name = NULL;
free(s2.name);
s2.name = NULL;
return 0;
}
深拷貝后缆巧,不存在兩個(gè)指針變量指向同一塊堆區(qū)內(nèi)存,但是這兩塊堆區(qū)內(nèi)存數(shù)據(jù)一樣豌拙,也達(dá)到兩個(gè)變量復(fù)制的結(jié)果陕悬,也不會(huì)因?yàn)閒ree造成不可預(yù)測(cè)的后果。