淺拷貝的問題
默認(rèn)提供的拷貝構(gòu)造就是淺拷貝,如果拷貝的對(duì)象中含有成員指針變量指向堆區(qū)中的內(nèi)存空間,那么就會(huì)出現(xiàn)兩個(gè)對(duì)象中的成員指針變量指向同一塊堆區(qū)空間,當(dāng)方法執(zhí)行結(jié)束后,對(duì)象就會(huì)被釋放,調(diào)用析構(gòu)函數(shù)(析構(gòu)函數(shù)中存在釋放在堆區(qū)開辟的內(nèi)存空間),就會(huì)存在一塊內(nèi)存空間被多次釋放的問題。文章來源:http://www.zghlxwxcb.cn/news/detail-425058.html
解決辦法
自己寫拷貝構(gòu)造,讓拷貝構(gòu)造后的對(duì)象中的成員指針變量指向一塊新的內(nèi)存空間。文章來源地址http://www.zghlxwxcb.cn/news/detail-425058.html
//
// Created by Administrator on 2023/4/25.
//
#include <iostream>
using namespace std;
// 深拷貝和淺拷貝
class Person {
public:
int p_age;
int *p_weight;
Person() {
cout << "無參構(gòu)造" << endl;
}
Person(int age, int height) {
p_age = age;
p_weight = new int(height);
cout << "有參構(gòu)造" << endl;
}
// 析構(gòu)函數(shù) 用于釋放手動(dòng)在堆區(qū)開辟的空間
~Person() {
if (p_weight != NULL) {
delete p_weight;
// 防止野指針
p_weight = NULL;
}
cout << "析構(gòu)函數(shù)" << endl;
}
// 拷貝構(gòu)造 不寫讓編譯器生成
// 防止 淺拷貝帶來的問題 自己寫拷貝構(gòu)造 避免這個(gè)問題
Person(const Person &p) {
cout << "自己寫的拷貝構(gòu)造,避免淺拷貝的問題" << endl;
p_age = p.p_age;
// 這是淺拷貝
// p_height = p.p_height; 自動(dòng)生成的就是這樣
// 深拷貝 重新開一塊空間 防止出現(xiàn)重復(fù)釋放的問題
p_weight = new int(*p.p_weight);
}
};
void test() {
Person p1(10, 120);
cout << "年齡為: " << p1.p_age << ", 體重為: " << *p1.p_weight << endl;
Person p2(p1);
cout << "年齡為: " << p2.p_age << ", 體重為: " << *p2.p_weight << endl;
// 會(huì) 先釋放p2 在釋放p1
// 釋放p2后析構(gòu)函數(shù)會(huì)將 堆區(qū)中開辟的空間釋放了 p1在此執(zhí)行析構(gòu) 在此操作那塊內(nèi)存就會(huì)報(bào)錯(cuò)
}
int main() {
test();
return 0;
}
到了這里,關(guān)于C++深拷貝與淺拷貝的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!