馴服野指標

2021-09-30 07:48:56 字數 900 閱讀 9695

,  有時我們不得不將物件按值傳遞給乙個函式, 但是你要知道,按值傳遞是什麼意思?它的意思就是,把實參的乙個拷貝傳遞給函式。這和剛才的初始化沒什麼兩樣,按位拷貝,函式體內的物件與外面的物件共用 一塊記憶體,即便在函式中的物件沒有對這塊記憶體進行過操作,但是當函式結束時。。。。析構函式將會被呼叫......

還有一種與之相反的情況......,當你想要把乙個在函式內的物件值返回給外面的物件時,這時候,會自動產生乙個臨時物件,由它容納函式的返回值, 並在函式結束時把結果傳給目標。那麼這個臨時物件迅速的被建立,並被迅速的釋放。。。一塊記憶體被釋放了兩次。其後果是不可預見的。

當你把乙個物件的值賦給另乙個物件時,如果你沒有過載賦值運算子,那麼也會導致按位拷貝。最終產生乙個野指標(乙個隱藏在類內的毒瘤),或者釋放同一塊記憶體多次。

看到了麼?害怕了麼?是不是感到c++到處都是陷阱呢?不但有陷阱,到處都是危險品。所有c中的疑難問題,到了c++就成了一般問題了。好了不廢話了,我們繼續講講解決之道。

對於最後的這種賦值的情況,我們只有通過過載賦值運算子才能解決,也就是避免按位拷貝。

至於前面的都屬於初始化,概括下來就是三種情況:

1.當乙個物件初始化另乙個物件時,例如在宣告中;

2.把所建立的物件拷貝(按值)傳遞給乙個函式時;

3.生成臨時物件時,最常見的就是函式的返回值。

解決初始化時的按位拷貝問題,我們通過建立拷貝建構函式來解決。

基本的拷貝建構函式形式為:

classname (const classname &o)

複製**

拷貝建構函式就是針對這個問題而設計的。

1 . 兩個類共有乙個物件,因為用乙個類的物件給另乙個類初始化了。

2 . 函式的物件引數,返回物件,都不好,這是為何用將返回的結果當作乙個指標引數傳入函式。 傳入的函式的物件引數也用乙個指標指到!

記憶體陷阱 馴服C 中的野指標

什麼是野指標?乙個母親有兩個小孩 兩個指標 乙個在廚房,乙個在臥室,屬於不同的 塊,其生存期不同 母親讓在廚房的小孩帶一塊蛋糕 指標指向的物件 給在臥室的小孩,這樣在臥室的孩子才肯寫作業。但這個在廚房的小孩比較淘氣,他在走出廚房時自己將蛋糕吃了,沒能帶出來。而在臥室的沒有吃到蛋糕,所以不肯完成他的作...

記憶體陷阱 馴服C 中的野指標

我們知道,c 將記憶體劃分為三個邏輯區域 堆 棧和靜態儲存區。既然如此,我稱位於它們之中的物件分別為堆物件,棧物件以及靜態物件。那麼這些不同的記憶體物件有什麼區別了?堆物件和棧物件各有什麼優劣了?如何禁止建立堆物件或棧物件了?這些便是今天的主題。一 基本概念 先來看看棧。棧,一般用於存放區域性變數或...

什麼是野指標?野指標的危害?如何避免野指標?

什麼是野指標?野指標是指隨機指向一塊記憶體的指標 野指標的危害?如何避免野指標?我們要在以後養成良好的編碼習慣 1.將沒有指向的指標初始化指向null 指向null的指標不能對他的指向進行修改 2.當想給乙個指標指向的空間賦值時,一定要給這個指標分配空間 malloc 3.當空間分配完後,要檢查這個...