動態記憶體管理核心:
首先,我們來過載一下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。根據以...