變量被析構函數釋放的時候的注意事項

作者:良知猶存

轉載請註明作者來源:https://mp.csdn.net/console/editor/html/10448795

圍觀歡迎添加wx:Allen-Iverson-me-LYN

 析構函數是C++類針對成員變量刪除時候執行的函數,析構函數與構造函數作用剛好相反,一個在定義變量的時候執行,一直在釋放的時候執行。在類裏面析構函數是默認定義好的,函數內部沒有任何執行的邏輯,它不會返回任何值,也不能帶有任何參數,只進行變量的釋放。如果你需要在析構函數裏面打印一些數據,可以重新定義一次析構函數。析構函數的名稱和類的名稱是完全相同的,只是在前面加個波浪號(~)最爲前綴,這時候我們自己定義好函數,在函數體內部就可以寫一些打印信息的操作。

   析構函數正常與構造函數一一對應的使用,但是有些時候因爲程序賦值的問題,會導致變量多次釋放,造成程序運行錯誤。

下面是一個簡單的析構函數多次釋放的示例

 

class Point
{
private:
    int x;
    int y;    
public:
    Point()
    {
        std::cout << "/* Point() */" << std::endl;
    }
    Point(int x,int y) : x(x),y(y)
    {
        std::cout << "/* Point(int x,int y) */" << std::endl;
    }
};

int main(int argc,char** argv)
{
    Point p1(2,3);
    Point p2 = p1;

    return 0;
}

    Point p1(2,3);
    Point p2 = p1;

終端顯示效果

                         

注意串口打印數據的

/* Point(int x,int y) */


/* ~Point() */釋放   
/* ~Point() */再一次被釋放

此時候發現一個變量被釋放了兩次。下面分析一下原因:


p1 與 p2都爲Piont類型。

其中:p1:

              .x = 2

              .y =3

p2 = p1 屬於值的拷貝,並沒有進行地址切換

程序在執行完打印之後,分配的變量會自動用析構函數釋放

p2 與 p1指向同一處地址,然後會被釋放兩次,所以需要注意。

 

"="賦值造成了混亂,此時候,引入了重載函數

此時運算符的重載中,我們可以使用“=”重載函數,可以在類中進行友員等重載,也可以在類之外進行重載,使其 = 賦值的時候形成新的變量,這樣釋放的時候就不會多次釋放了。

本次實現在類裏面實現

 

考慮到返回值的效率小於返回引用,所以所以返回引用 

     Point& operator=(const Point& p)
    {
        cout << "operator=(const Point& p)" << endl;
        if(this == &p)
            return *this;
        this->x = p.x;
        this->y = p.y;
        return *this;
    }  

    在類裏面添加此重載函數,進行利用重載函執行“=”的時候,將變量信息地址重新申請定義,這樣變成兩個不同變量,再釋放就不會擔心多此釋放的問題了。

                                                 

 

                                                                                 ——END——

                                                   1582516653291945.png

 

 

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