C++——淺拷貝、深拷貝、寫時拷貝的清楚講解

淺拷貝:

在拷貝構造的時候,直接將原內容的地址交給要拷貝的類,兩個類共同指向一片空間。最終導致的問題是,s1、s2共用同一塊內存空間,在釋放時同一塊 空間被釋放多次而引起程序崩潰,這種拷貝方式,稱爲淺拷貝。

淺拷貝:也稱位拷貝,編譯器只是將對象中的值拷貝過來。

深拷貝:

通過開闢和源空間大小相同的空間並將內容拷貝下來再進行操作。不論是否對s2進行操作,都會拷貝一片相同大小的空間以及內容下來。

寫時拷貝:

寫時拷貝就是一種拖延症,是在淺拷貝的基礎之上增加了引用計數的方式來實現的。

引用計數:用來記錄資源使用者的個數。在構造時,將資源的計數給成1,每增加一個對象使用該資源,就給 計數增加1,當某個對象被銷燬時,先給該計數減1,然後再檢查是否需要釋放資源,如果計數爲1,說明該 對象時資源的最後一個使用者,將該資源釋放;否則就不能釋放,因爲還有其他對象在使用該資源。

#include <iostream>
using namespace std;

class String
{
public:
    String(char* str = "")
        :_str(new char[strlen(str)]+1)
        , _refCount(new int(1))
    {
        strcpy(_str, str);
    }

    String(const String& str)
        : _str(str._str)
        ,_refCount(str._refCount)
    {
        (*_refCount)++;
    }

    ~String()
    {
        release();
    }

    String& operator= (const String& s)
    {
        if (_str != s._str)
        {
            release();
            _refCount = s._refCount;
            (*_refCount)++;
            _str = s._str;
        }
        return *this;
    }

    void release()
    {
        if ((*--_refCount) == 0)
        {
            delete[] _str;
            delete _refCount;
        }
    }

private:
    char* _str;
    int* _refCount;
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章