7 成員函式指標 物件導向的記憶體管理

2021-10-25 02:28:45 字數 3443 閱讀 7993

// 乙個例子

class a

void

fun(

int,

int)};

// pf是乙個指標

// 指向乙個型別a的成員函式

// 該成員函式形參為(int,int)

// 返回值為void

void

(a::

*pf)

(int

,int);

pf =

&a::fun;

a a;

a *pa =

&a;(a.

*pf)(10

,10);

(pa->

*pf)(10

,10);

function<

void

(const a&

,int

,int

)> fcn =

&a::fun;

vector vec =

;find_if

(vec.

begin()

, vec.

end(

), fcn)

;function<

void

(a*,

int,

int)

> fcn =

&a::fun;

vector> vec =

;find_if

(vec.

begin()

, vec.

end(

), fcn)

;

class a~a

()..

.}

c++中一切皆型別[基礎資料型別也可視為型別處理]
- 分配
// 實際執行兩步

// - 呼叫void* operator new(size_t)可定製操作符進行物件a記憶體空間分配

// - 呼叫new (p) a(實參列表)不可定製的定位new表示式完成位址a處物件a的構造

a* p = new a

(實參列表)

;// 實際執行兩步

// - 呼叫void* operator new(size_t)可定製操作符進行10個物件a連續記憶體空間分配

// - 呼叫new (pa) a[10]不可定製的定位new表示式完成位址p處開始連續10個物件a的預設構造

a* pa = new a[10]

;

- 釋放
// 實際執行兩步

// - 呼叫p->~a()完成p指向物件a的析構

// - 呼叫void* operator delete(void*)可定製操作符,完成p指向位置乙個a物件大小記憶體空間的釋放

delete p;

// - 對陣列每個元素pi呼叫pi->~a()完成pi指向物件a的析構

// - 呼叫void* operator delete(void*)可定製操作符,完成p指向位置10個a物件大小記憶體空間的釋放

delete [

] pa;

- 分配
a* p = operator new

(sizeof

(a))

;new (p)

a(實參列表)

;a* pa = operator new

(sizeof

(a)*10)

;for

(int i =

0; i <

10; i++

)

- 釋放
p->~a

();operator delete

(p);

for(

int i =

0; i <

10; i++

)operator delete

(pa)

;

注意:

- operator new()會呼叫malloc進行記憶體分配

malloc分配後返回的指標指向首個可用有效位元組位置.在此位置前,還有一部分已分配的記憶體,

用於記錄此返回指標可用的記憶體空間大小等管理資訊.

即malloc實際分配的內容為我們要求的資料區+管理區,

資料區還會有對齊要求,可能分配的資料區比要求的大.

因為上述原因,malloc返回的乙個指標,需要相應的呼叫一次free完成指向的整塊空間的分配

對malloc分配的大塊空間,多次在此空間不同位置,使用多次free是不允許的.

operator new/operator delete分別是malloc/free的簡單封裝

operator new/operator delete與operator new/operator delete除了名字差異,沒有什麼本質差別.

都是malloc/free的簡單封裝

std:

:allocator alloc;

- 分配

t* p = alloc.

allocate(1

);alloc.

construct

(_p,t(

));t *pa = alloc.

allocate(10

);for(

int i =

0; i <

10; i++

)- 釋放

alloc.

destroy

(p);

alloc.

deallocate

(p,1);

for(

int i =

0; i <

10; i++

)alloc.

deallocate

(pa,10)

;

注意:

- alloc.deallocate(void*, size_t)的引數2一般是被忽略的.

因為如前所述,

乙個alloc.allocate(size_t)內部借助malloc返回一塊空間

而乙個malloc返回的一塊空間,也只需也只能通過返回指標呼叫一次free來釋放.

故一般實現alloc.deallocate的引數2是被忽略的.

c++一切皆物件

不可用malloc/free來分配和釋放物件

malloc/free完成的是記憶體空間的分配和釋放,不會對分配的物件執行構造[在指定位址調建構函式]和析構[在指定位址調析構函式].

malloc/free是c中分配/釋放記憶體的方式,不適合c++中物件的分配/釋放

C 物件導向 類成員函式this指標

每個類成員函式都只涉及乙個物件,即呼叫它的物件。但有時候方法可能涉及到兩個物件,在這種情況下需要使用c 的 this 指標 假設將方法命名為topval 則函式呼叫stock1.topval 將訪問stock1的物件資料 stock2.topval 將訪問stock2的物件資料 如果希望該方法的兩個...

3 1 成員函式,物件拷貝,私有成員

主main函式 include include time.h 成員函式,物件拷貝,私有成員 1 綜述 2 類基礎 3 成員函式 4 物件的拷貝 5 私有成員 using namespace std struct student class time void inittime int tmphour...

15 成員函式的分離

1 標頭檔案的宣告 pragma once 表示的是只包含一次 ifndef a h意思是 if not define a.h 如果不存在a.h 接著的語句應該 define a h 就引入a.h 最後一句應該寫 endif 否則不需要引入 ifndef teacher2 h define teac...