C和C++中一些概念的本質(不斷更新,歡迎交流)

臣有一事不知當不當講發表於2018-04-14

引用的本質:

引用是一個特殊的變數,這個變數的內容是繫結在這個引用上面的物件的地址,使用這個變數時,系統就會自動根據這個地址去找到它繫結的變數,然後再對變數進行操作。所以本質上來說,引用還是指標,只是這個指標不能修改,任何對它的操作都會發生在這個指標所指向的地方,而不是在這個指標上。

代理的本質:

通過代理對物件的操作,是通過引用或者指標來進行的,通過這種方式,就可以提高效率。

free()函式的本質:

      free()的呼叫方式是:void   free(void   *ptr)。是釋放由ptr所指的記憶體,並將它返回給堆,以便這些記憶體成為再分配時的可用記憶體。free()函式只能用於以前由動態地址分配的函式。如果呼叫無效指標很可能毀壞記憶體管理機制,並且引起系統破壞的。
       free是呼叫作業系統的函式,將原先分配的記憶體區域釋放。在作業系統中分配記憶體不是簡單的給一個指標,而是在核心中維護每個程式的分配記憶體表,free則是用指標找到對應分配的表項然後釋放。  
        釋放記憶體不是丟掉指標。否則的話後患無窮,就是記憶體洩漏。那麼malloc到底做什麼?free到底做什麼?簡單的說,malloc在一個特定的記憶體區劃出一塊你利用引數指定的大小的記憶體塊,然後把這塊記憶體的開始地址返回。這要求你用一個指標來接收。否則也會出現記憶體洩漏。因為這塊記憶體你申請了之後,並沒有釋放。說到這裡補充一句,malloc函式分配的記憶體空間不會自動釋放,需要你操作來完成。需要的操作就是free。那麼free做什麼呢?就是將指標指定的記憶體空間釋放,如果發現指定的記憶體空間不是在與malloc匹配的記憶體空間,free操作就會失敗。所以free做的是釋放指標指向的用malloc申請的特定的記憶體空間,而不是指標本身。
        結論:使用方法 對於用malloc分配空間的指標p, 使用過後要這樣釋放:
        free(p);
        p=NULL;

也就是說,只是釋放記憶體,而指標其實一直都在,只是為NULL。

友情連結:https://blog.csdn.net/hihozoo/article/details/51441521

const的本質

const修飾的是變數,只是這個變數是隻讀的。(可以通過指標進行修改)

現代的編譯器(gcc、vc)會將const修飾的全域性變數編譯進入只讀儲存區,如果對其進行修改,則會報錯;

對於區域性變數,則儲存在棧上。

#define巨集定義的本質

巨集定義的常量本質是字面量,不佔用記憶體,而是儲存在只讀儲存區。

#typedef的本質

它只是給一個已經存在的資料型別重新命名,本質是不產生新的資料型別。

條件編譯的本質

前處理器根據條件編譯指令有選擇的刪除程式碼,編譯器其實並不知道分支程式碼的存在。

而if...else...是在編譯階段進行分支判斷的,與#ifdef...#else...#endif有本質上的區別。

#include的本質

#include的本質是將已經存在的檔案嵌入到當前檔案中,重複包含會報錯,變成重複定義。(條件編譯可以解決重複包含標頭檔案的情況)

#line的本質

#line的本質是重定義 __FILE__和__LINE這兩個巨集











相關文章