C 的全域性構造與析構函式

2022-06-22 03:18:11 字數 941 閱讀 8929

我們知道一般的c/c++ 的程式是從main函式開始的,然後在main函式結束後程式結束。但是不然,在main函式開始執行前,已經有其他的指令被執行了。

為了程式的順利執行,首先要初始化執行環境,比如堆分配初始化(malloc, free) ,執行緒子系統等,這裡先提一下:c++ 的全域性物件建構函式就是在這一時期被執行的。即c++ 的全域性物件建構函式在main 函式之前執行,而c++ 全域性物件的析構函式在main函式之後被執行。

linux 系統中,一般程式的入口是「 _start ", 這個函式是linux系統庫(glibc)的一部分。當我們的程式與glibc庫鏈結在一起形成最終的可執行檔案以後,這個函式就是程式的初始化部分的入口,程式的初始化部分完成一系列初始化過程以後,就會呼叫main函式來執行程式的主體。在main函式執行完成以後,返回到初始化部分,會進行一系列清理工作,然後結束程序。

對於有些場合,程式的一些特性的操作必須在main函式之前執行,還有一些操作必須在mian函式之後執行,這裡再提一下c++ .因為最具代表性的就是c++ 的全域性物件的構造與析構函式。因此elf(linux裡一種檔案格式)檔案定義了兩種段涉及到了這種資訊。

§.init該段裡邊儲存的是可執行命令,它構成了程序的初始化**。因此,當乙個程式開始執行時,在main函式被呼叫前glibc的初始化部分安排執行這個段中的**。

§.fini該段儲存著程序終止**指令。因此,當乙個程式的main函式正常退出時,glibc會安排執行這個段中的**。

因此,這兩個段.init 和 .fini的存在有著特別的目的,如果乙個函式放到了.init 段,在main函式執行前,系統就會執行它。同理,假如乙個函式放到了.fini段,在main函式返回後函式就會被執行。利用這兩個特徵,c++ 的全域性建構函式和析構函式就是這樣來的。

《程式設計師的自我修養》

全域性構造與析構

在main函式執行之前,要先初始化程序執行環境。比如堆疊分配初始化 malloc,free 執行緒子系統等。c 的全域性物件的建構函式在main之前被執行,c 全域性物件的析構函式在main之後被執行。linux系統庫 glibc。當我們的程式與glibc庫鏈結在一起形成最終可執行檔案以後,這個函式...

c 構造與析構函式

一.建構函式與析構函式 1 c 中的類可以定義與類名相同的特殊成員函式,這種函式叫做建構函式。2 建構函式在定義時可以有引數。3 沒有任何返回型別的宣告。4 一般情況下系統會自動呼叫,在一些情況下會收手動呼叫。建構函式有無參構造,有參構造,賦值 拷貝建構函式。include using namesp...

c 建構函式與析構函式

一 建構函式 c 提供建構函式來處理物件的初始化,建構函式是一種特殊的成員函式,與其他的成員函式不同,不需要使用者來呼叫他,而是在建立物件時自動執行。它的特點是 函式名和類名相同,沒有返回值,可以過載 如果程式中未宣告,則系統自動產生出乙個預設的建構函式,預設的建構函式時不帶引數的。比如 stude...