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段 在程式中沒有初始化的全域性變數 核心...