自定義記憶體管理(二)

2021-09-24 13:27:01 字數 2342 閱讀 3152

new關鍵字建立出來的物件位於什麼地方?

你會直接回答在堆空間內嗎,有沒有想過會在其他地方,比如在靜態儲存區。

讓我來分析一下你就明白了。

首先我們要明確的是:

– new/delete 的本質其實是 c++ 預定義的操作符

– c++對這兩個操作符做了嚴格的定義行為

new:

獲取足夠大的記憶體空間(預設為堆空間

在獲取的空間中呼叫建構函式建立物件

delete:

呼叫析構函式銷毀物件

歸還物件所占用的空間(預設為堆空間

既然 new 和 delete 是操作符,那我們在 c++ 中就可以對其進行過載

那怎麼過載

// 不論你寫不寫static,他都是靜態函式

// static member function

void

*operator

new(

unsigned

int size)

// static member function

void

operator

delete

(void

* p)

我們試試在靜態儲存區里建立動態物件,使 new 出來的物件不再堆空間,而是在靜態儲存區。

#include

using

namespace std;

class

test

void

*operator

new(

unsigned

int size)

}return ret;

}void

operator

delete

(void

* p)}}

};//靜態成員類外初始化

char test::c_buffer[

sizeof

(test)

*test::count]=;

char test::c_map[test::count]=;

intmain()

;for

(int i =

0;i<

6;i++

)for

(int i =

0;i<

6;i++

)return0;

}

是不是覺得很神奇。這個方法可以規定這個類能產生多少個物件。

能不能做到在指定的位址上建立c++物件?

解決方案

#include

#include

//提供 malloc calloc free

using

namespace std;

class

test

// 用來設定空間的函式

static

bool

setmemorysource

(char

* memory,

unsigned

int size)

else

return ret;

}void

*operator

new(

unsigned

int size)}}

else

return ret;

}void

operator

delete

(void

* p)

}else}}

};//靜態成員類外初始化

char

* test::c_buffer =

null

;char

* test::c_map =

null

;unsigned

int test::count =0;

intmain()

;char buffer[12]

=;// char buffer[1] = ;

// 把這塊空間設定進去

test::

setmemorysource

(buffer,

sizeof

(buffer));

test* pa[6]

=;for(

int i =

0;i<

6;i++

)for

(int i =

0;i<

6;i++

)return0;

}

C 自定義記憶體 管理

工作中常常需要,將一些資料放到記憶體中處理,有時候資料量好大多達3g的空間。而且自己儲存都是一些指標之類的東西,每次都要new,容器中儲存的量好大,四五百萬個。而且最頭疼的就是 析構的時候要等好久才能釋放掉這個東西。查了好久 發現最流行的就是 空間換時間。說了也慚愧,在學校中沒怎麼學到高深的東西,好...

delphi 自定義記憶體管理

1.主要通過getmemorymanager來hook原來的記憶體管理。2.通過setmemorymanager來設定你自己的新的記憶體管理,可以用乙個記憶體池來優化和管理程式的記憶體呼叫情況。procedure registermemmgr varamgr tmemorymanagerex beg...

過載new delete自定義記憶體管理

new delete是c 預定義的操作符。new delete行為 new 1 獲取足夠大的記憶體空間 預設是堆空間 2 呼叫類的建構函式建立物件 delete 1 呼叫析構函式銷毀物件 2 記憶體空間 預設為堆空間 不管是new還是delete操作,都有兩步,new和delete操作是對稱的。c ...