C 動態記憶體管理核心知識點總結

2021-07-28 08:15:14 字數 2538 閱讀 5147

動態記憶體管理核心:

首先,我們來過載一下operator new ();進行預處理,給我們列印一些有用的 資訊,比如:當前定位的行號,開闢空間的大小(方便我們對於記憶體洩漏的檢查)

#include

using

namespace

std;

class test

~test()

private:

int _data;

};void* operator

new(size_t size, const

char*filename, const

char*funcname, int lineno)

#if _debug

#define new new(__file__,__funcdname__,__line__)

#endif

//此時需要對operator new 進行過載,系統中沒有合適的operator new

void funtest()

int main()

效果如圖所示:

下來,我們對new/delete 和new和delete進行仿寫,了解一下底層實現

#include

using

namespace

std;

class test

~test()

private:

int _data;

};test* new(size_t size)

//執行建構函式

new(p)test;//定位new 表示式執行建構函式

return p;

}//delete ->析構函式-》釋放空間

void delete(test*p)

}//new-->malloc

//多開闢四個位元組來儲存陣列數量

test* newarray(size_t count)

*p = count;

//p = (test*)(p + 1);->型別不匹配,我們重新定義乙個指標

test* pt = (test*)(p + 1);

for (size_t idx = 0; idx < count; ++idx)

return pt;//返回起始建構函式的位置

}//delete

void deletearray(test*p)

int count = *((int *)p - 1);

//從後往前析構

for (int idx = count - 1; idx >= 0; --idx)

free((int *)p - 1);//從開闢的起始位置進行釋放

接下來,我們再來看一下為什麼一定要匹配使用?

#include

using

namespace

std;

class date

;void funtest1()

void funtest2()

int main()

程式執行完,並沒有發生錯誤。

因為對於內建型別和沒有顯示給出析構函式的類,系統可以直接釋放。

那我們顯示給出析構函式看一下程式執行結果。從上面的導圖餓哦們可以大致了解到,對於非內建型別或無自定義析構函式的類型別來說,析構一段陣列空間時,需要知道陣列的大小。

此時。程式就會發生崩潰,這就是我們為什麼要配套使用new/delete 與new/delete 的原因了。

new的開闢四個位元組空間圖:

注:該圖來自於:

Eureka核心知識點

一 eureka特性 1.當註冊中心掛了,客戶端之間依然可以通過原有的登錄檔進行呼叫 註冊中心重啟後,客戶端會繼續註冊進來 2.當服務提供者掛了,在關閉自我保護的情況下,註冊中心在規定時間 預設是60s 內移除客戶端 關閉eureka註冊中心的自我保護模式,配置如下 eureka server en...

Eureka核心知識點

一 eureka特性 1.當註冊中心掛了,客戶端之間依然可以通過原有的登錄檔進行呼叫 註冊中心重啟後,客戶端會繼續註冊進來 2.當服務提供者掛了,在關閉自我保護的情況下,註冊中心在規定時間 預設是60s 內移除客戶端 關閉eureka註冊中心的自我保護模式,配置如下 eureka server en...

Redis核心知識點

快照間隔內的資料會丟失 如果資料量很大,儲存快照時間會比較長 同步選項 always 每個命令同步 everysec 每秒同步一次 no 系統決定 redis會把設定了過期時間的key放在單獨的字典中,定時遍歷來刪除到期的key。為了保證不會迴圈過度,導致卡頓,掃瞄時間上限預設不超過25ms。根據以...