static在記憶體層面的作用 C 記憶體管理筆記

2021-10-14 08:13:12 字數 3169 閱讀 8520

1.記憶體分配層次

c++ 申請記憶體分配:

1. crt : malloc / free

2. c++ primitives : new , new , new() , ::operator new()

3. c++ library : std::allocator

分配釋放

類別能否過載

malloc()

free()

c函式不能

newdelete

c++表示式

不能::operator new()

::operator delete()

c++函式

能allocator:: allocate()

allocator:: deallocate()

c++標準庫

可以自由設計來配置任何容器

2. 三個層次的基本使用

void *p1 = malloc[520];

free(p1);

complex* p2 = new complex; //乙個物件

delete p2;

void * p3 = ::operator new(520); //520個位元組,底層呼叫的就是malloc

::operator delete(p3); //底層呼叫的就是free

//以下是c++ 標準庫提供 的 allocators.

//其介面雖然有標準規格,但是實現廠商並未完全遵守;下面為vc 和 gnu c 實現的差別。

#ifdef _vs_

int* p4 = allocator().allocate(10,(int*)0); //allocate是非靜態函式,需要通過物件來呼叫

allocator().dealloctate(p4,3); //deallocate也是是非靜態函式,需要通過物件來呼叫

#endif

#ifdef _gunc2.9__

void* p4 = alloc::allocate(512); //這兩個函式都是靜態的,可以通過全名呼叫它們,以下分配512bytes

allco::deallocate(p4,512);

#endif

#ifdef _gnuc4.9__

void * p4 = allocator( ).allocate( 7 ); //gcc 4.9 中空間配置器(allocator)的實現向標準看齊了

allocator( ).deallocate( (int*) p4 , 7 ); //allocate 和 deallocate 都是非靜態函式,需要通過物件來呼叫

3. 中間層次的底層實現 ( new , new , new() , ::operator new() )

(1) new 和 delete

① new 作用:申請分配記憶體並呼叫建構函式

complex* pc = new complex(1,2);

//編譯器轉為下面的**

complex* pc;

trycatch( std::bad_alloc )

上述**中的operator new 函式 如下:

void* operator new(size_t size , const std::nothrow_t&) _throw0()

return (p);

}

可見,從 new 到 operator new ,最終我們發現呼叫的還是malloc函式。

② delete 作用:釋放記憶體 並 呼叫析構函式

complex* pc = new complex(1,2);

...delete pc;

//編譯器轉為

pc->~complex(); //析構

operator delete(pc); //釋放記憶體

上述**中的operator delete 函式 如下:

void __cdecl operator delete(void *p) _throw0()

可見,從 delete 到 operator detele,最終我們發現呼叫的還是free函式。

(2) array new , array delete

① array new

complex* p = new complex[3];

//呼叫了三次 預設建構函式

...delete p;

//呼叫了三次 析構函式

這裡重點說明乙個問題:用array new 出來的指標,在對其進行delete釋放記憶體時,如果不加"" 會怎麼樣

答:delete 的作用是 先呼叫析構函式,再釋放掉之前申請的記憶體,當你要釋放的記憶體裡的物件的析構函式不重要時(也就是說物件內部沒有申請新的堆區記憶體),有無""將沒有差別;但是當物件的析構函式重要時(物件內部申請了堆區記憶體),不新增""將會導致只呼叫一次析構函式,當申請的記憶體中儲存了n個物件,就會導致n-1個物件無法呼叫自己的析構函式,這些物件中的指標所指向的堆區記憶體將無法被釋放(因為沒有呼叫析構函式),進而導致記憶體洩漏。

(3) placement new

placement new 可以用來對已申請的記憶體通過建構函式來產生物件。因此,沒有placement delete ,因為 placement new 沒有分配記憶體。

include delete  buf;char* buf = new char[ sizeof( complex )*3 ];         

complex* pc = new( buf )complex(1,2); //呼叫建構函式

//上面這一行** 編譯器轉為如下**

complex* pc;

trycatch( std::bad_alloc )

...

C 介面的作用

c 介面是乙個讓很多初學c 者容易迷糊的東西,用起來好像很簡單,定義介面,裡面包含方法,但沒有方法具體實現的 然後在繼承該介面的類裡面要實現介面的所有方法的 但沒有真正認識到介面的作用的時候就覺得用介面是多此一舉,當然你這樣想那是絕對絕對錯誤的,比爾蓋茨的微軟請的員工都是比蓋茨還聰明的人,他們的c ...

C中static的作用

1.static 變數靜態變數的型別 說明符是 static 靜態變數當然是屬於靜態儲存方式,但是屬於靜態儲存方式的量不一定就是靜態變數。例如外部變數雖屬於靜態 儲存方式,但不一定是靜態變數,必須由 static 加以定義後才能成為靜態外部變數,或稱靜態全域性變數。2.靜態區域性變數 靜態區域性變數...

c語言中static作用

本文根據多篇網路部落格整合而成一.c程式一直由下列部分組成 1 正文段 cpu執行的機器指令部分 乙個程式只有乙個副本 唯讀,防止程式由於意外事故而修改自身指令 2 初始化資料段 資料段 在程式中所有賦了初值的全域性變數,存放在這裡。3 非初始化資料段 bss段 在程式中沒有初始化的全域性變數 核心...