最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++深拷貝與淺拷貝的區(qū)別及應(yīng)用

 更新時(shí)間:2021年04月12日 11:38:57   作者:尋癡  
這篇文章主要給大家介紹了關(guān)于C++深拷貝與淺拷貝區(qū)別及應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

淺拷貝

只是對(duì)指針的拷貝,拷貝后兩個(gè)指針指向同一個(gè)內(nèi)存空間;

深拷貝

對(duì)指針指向的內(nèi)容進(jìn)行拷貝(重新分配內(nèi)存),經(jīng)深拷貝后的指針是指向不同地址的指針;

因此淺拷貝釋放內(nèi)存的時(shí)候很容易出現(xiàn)因?yàn)獒尫艃蓚€(gè)指針而內(nèi)存出錯(cuò)。

淺拷貝(釋放時(shí),因?yàn)槎啻吾尫懦鲥e(cuò))

只拷貝指針

	//拷貝構(gòu)造函數(shù)
	Vector(const Vector<T>& v)
		:_start(nullptr)
		,_finish(nullptr)
		,_endOfStorage(nullptr)
	{
		_start=v._start;
		_finish=v._finish;
		_endOfStorage=v._endOfStorage;
	}

深拷貝

對(duì)資源進(jìn)行拷貝

 Vector(const Vector<T>& v)
	
		:_start(nullptr)
		, _finish(nullptr)
		, _endOfStorage(nullptr)
	{
		size_t n = v.capacity();
		_start = new T[n];
		for (size_t i = 0; i < v.size(); ++i)
		{
			_start[i] = v[i];
		}
		_finish = _start + v.size();
		_endOfStorage = _start + n;
	}

寫(xiě)一個(gè)Vector的類

 template<class T>
class Vector
{
typedef T* operator;
typedef const T* const_iterator;
	iterator _start;
	iterator _finish;
	iterator _endOfStorage;
	
 public:
//構(gòu)造函數(shù)
 Vector()
		:_start(nullptr)
		, _finish(nullptr)
		, _endOfStorage(nullptr)
	{}

	//析構(gòu)函數(shù)
	~Vector()
	{
		if(_start)
		{
			delete[] _start;
			_star=_finish=_endOfStorage=nullptr;
		}
	}
T& operator[](size_t pos)
	{
		if (pos >= 0 && pos < size())
			return _start[pos];
	}
size_t size() const
{
	return _finish - _start;
}
 
size_t capacity() const
{
	return _endOfStorage - _start;
}


};

可以用自己編輯器,把拷貝放進(jìn)去試試;

附:c++深拷貝與淺拷貝問(wèn)題實(shí)例

淺拷貝:簡(jiǎn)單的賦值拷貝操作;

深拷貝:在堆區(qū)重新申請(qǐng)空間,再進(jìn)行拷貝操作;

問(wèn)題:淺拷貝會(huì)帶來(lái)堆區(qū)內(nèi)存被重復(fù)釋放的問(wèn)題,析構(gòu)函數(shù)被調(diào)用多次,導(dǎo)致程序運(yùn)行崩潰;

解決:通過(guò)深拷貝解決,在堆區(qū)重新申請(qǐng)內(nèi)存,各自釋放自己的內(nèi)存,避免重復(fù)釋放;

#include <iostream>

using namespace std;

class Person
{
public:
    Person() {
        cout << "Person的默認(rèn)構(gòu)造函數(shù)調(diào)用"<<endl;
    }
    Person(int age,int height) {
        m_Age = age;
        m_Height = new int(height);//堆區(qū)重新申請(qǐng)空間,進(jìn)行深拷貝,手動(dòng)申請(qǐng),手動(dòng)釋放;
        cout << "Person的有參函數(shù)調(diào)用" << endl;
    }
    int m_Age;
    int *m_Height;

    //自己實(shí)現(xiàn)拷貝構(gòu)造函數(shù),來(lái)避免編譯器的拷貝構(gòu)造函數(shù)造成淺拷貝問(wèn)題;
    Person(const Person& p) {
        cout << "Person拷貝構(gòu)造函數(shù)" << endl;
        m_Age = p.m_Age;
        //m_Height = p.m_Height; 淺拷貝,編譯器默認(rèn)實(shí)現(xiàn)這行代碼;
        m_Height = new int(*p.m_Height);//深拷貝
    }

    ~Person() {
        //析構(gòu)代碼,將堆區(qū)開(kāi)辟數(shù)據(jù)做釋放操作
        if (m_Height != NULL) {
            delete m_Height;
            m_Height = NULL;
        }
        cout << "Person的析構(gòu)函數(shù)調(diào)用" << endl;
    }
};

void test01(){
    Person p1(18,160);
    cout << "p1的年齡為:" << p1.m_Age<<"p1身高為:"<<*p1.m_Height<< endl;
    Person p2(p1);//編譯器默認(rèn)調(diào)用拷貝構(gòu)造函數(shù),進(jìn)行淺拷貝操作
    cout << "p2的年齡為:" << p2.m_Age<< "p2身高為:"<<*p2.m_Height << endl;
}

int main(){
    test01();
    system("pause");
}

程序運(yùn)行結(jié)果:

總結(jié)

到此這篇關(guān)于C++深拷貝與淺拷貝區(qū)別及應(yīng)用的文章就介紹到這了,更多相關(guān)C++深拷貝與淺拷貝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

广灵县| 灵丘县| 桂阳县| 晋城| 福州市| 灵台县| 南投市| 方山县| 苏尼特左旗| 略阳县| 阿拉善右旗| 射阳县| 金塔县| 栾城县| 红安县| 宁夏| 正安县| 甘南县| 娄底市| 平利县| 漳平市| 封开县| 永平县| 三河市| 合肥市| 临澧县| 定兴县| 新巴尔虎右旗| 英吉沙县| 乐陵市| 杭州市| 喀喇沁旗| 河西区| 宁城县| 涞水县| 手机| 孟连| 宁河县| 普安县| 合山市| 辽中县|