溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中深拷貝與淺拷貝有什么區(qū)別

發(fā)布時間:2021-04-12 15:26:26 來源:億速云 閱讀:292 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)C++中深拷貝與淺拷貝有什么區(qū)別,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。

淺拷貝

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

深拷貝

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

因此淺拷貝釋放內(nèi)存的時候很容易出現(xiàn)因為釋放兩個指針而內(nèi)存出錯。

淺拷貝(釋放時,因為多次釋放出錯)

只拷貝指針

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

深拷貝

對資源進行拷貝

 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;
	}

寫一個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;
}


};

可以用自己編輯器,把拷貝放進去試試;

附:c++深拷貝與淺拷貝問題實例

淺拷貝:簡單的賦值拷貝操作;

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

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

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

#include <iostream>

using namespace std;

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

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

    ~Person() {
        //析構(gòu)代碼,將堆區(qū)開辟數(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);//編譯器默認調(diào)用拷貝構(gòu)造函數(shù),進行淺拷貝操作
    cout << "p2的年齡為:" << p2.m_Age<< "p2身高為:"<<*p2.m_Height << endl;
}

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

程序運行結(jié)果:

C++中深拷貝與淺拷貝有什么區(qū)別

關(guān)于C++中深拷貝與淺拷貝有什么區(qū)別就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI