C 侯捷 堆 棧與記憶體管理

2021-10-04 11:03:14 字數 1322 閱讀 8409

class complex ;

...complex c3(1,2);

void main()

stack棧:是存在於魔偶作用域的一塊記憶體空間,函式本身會形成乙個stack,存放接收的引數和返回位址以及local object。c1所用的空間來自stack。器生命在作用域之內有效,會自動清理,析構函式自動呼叫。

static object,生命在作用域結束之後仍然存在,析構函式在整個程式結束時呼叫。

golbal object:在程式結束時呼叫析構函式。

heap堆:是指有作業系統提供的一塊全域性記憶體空間,可以通過動態分配來獲取。p所指向的空間來之heap。

new:先分配memory,在呼叫建構函式

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

void*mem = operator new(sizeof(complex)); 其內部呼叫malloc()

pc = static_cast(mem); 進行了乙個轉型

pc->complex::complex(1,2); 呼叫建構函式,建構函式的全名:complex::complex(pc,1,2);pc是個隱藏的引數,通過this指標指向。

delete:先呼叫析構函式,再釋放記憶體

string* ps = new string("hello");

...delete ps;

1.string::~string(ps); 編譯器給的析構函式時沒有做什麼事情的,對之前自己寫的string類中,析構函式將string類中動態分配的記憶體釋放掉。

2.operator delete(ps); 其內部呼叫free(ps),把字串本身free,其中只有乙個指標。

用vc的除錯模式可以看到new分配的記憶體位址。new乙個變數之後,除了得到本身的大小,還會得到前面32個後面4個以及前後各乙個cock(4個位元組),vc中每一塊都是16的倍數,如果總和不夠,還要填補一些空間進去。多的時給釋放的時候用的,在vc的非除錯模式下沒有前後32+4的位元組空間只有前後的cock,cock中記錄了分配的空間大小,但是都是16的倍數,最後四位都是零,藉以為來記錄是還進來還是給出去,還進來是0,給出去是1.

new的時候用,delete的時候也要用,這是陣列形式的。vc中陣列在分配記憶體的時候,在存資料的前面會加4個位元組,用來記錄陣列元素的個數。如果不搭配中括號會造成記憶體洩漏。上面delete中第二步刪除的時候會看cock,將整個塊刪除。加上中括號,編譯器會知道呼叫呼叫多次析構函式,將動態分配的記憶體刪掉,如果不加中括號,只會呼叫析構函式一次,後面的部分就不會刪掉。如果類的成員中沒有指標,就不會存在這種情況,加不加中括號都會刪掉。

侯捷C 筆記

1.如果是類中唯讀函式後面沒有加上const,這樣如果變數定義成const,而函式沒寫成const,這樣編譯期會困惑。2.相同class的各個物件objects互為友元。3.建構函式初始化用 比 裡面初始化效率更高。4.函式返回值寫成void時,應該考慮鏈式賦值,如果是void就行不通了。5.拷貝賦...

C 堆 棧與記憶體管理

一 所謂stack和heap 例子 class complex 作用域 scope stack 儲存區域性變數或臨時物件的一塊記憶體,函式呼叫結束會消失 heap 存放全域性物件或變數的記憶體空間,函式呼叫結束如果不通過delete 釋放將直到程式執行結束之前一直存在。二 static local ...

侯捷 C 標準11 14

本篇記錄學習 侯捷 c 標準11 14 一 演進 環境與資源 1 c 2.0的新特性,包括語言的部分和標準庫的部分。tr1是2003年的版本,即c 1.0。二 variadic templates 1 數量不定的模板引數,引數個數和引數型別都未定。三 spaces in template expre...