日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

通过从全局和类内部重载operator new /delete来获取内存管理权

發布時間:2023/12/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过从全局和类内部重载operator new /delete来获取内存管理权 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 1、通過重載獲得內存管理權
  • 2、容器的內存管理
  • 3、重載new、array new、replacement new,接管內存控制權
    • 1、重載全局::operator new / ::operator delete以及array版本
    • 2、在類里面去重載

1、通過重載獲得內存管理權

之前的幾章學習,是紅色的路線。此時內存管理權限不在我們手中。
接下來,通過class內部的重載operator new/delete,我們可以獲得內存管理權力。
注意operator new/delete,這張PPT里面有兩個。一個是在class內部重載,還有一個是全局的重載。

2、容器的內存管理

當我們將元素放入容器中,容器顯然也要做出與上面相似的內存分配的動作。
容器講構造和析構函數包裝在construct()與destroy()中。內存的分配和釋放動作拉入分配器中。
分配器在分配內存的時候與上圖的紅色線路是一樣的。
分配器所做的就是一些復雜的內存管理。

3、重載new、array new、replacement new,接管內存控制權

已知,我們可以從全局或者類里面去重載。

1、重載全局::operator new / ::operator delete以及array版本

注意這里的重載函數相對于原來的函數只是多了一個打印信息操作。
這里只是做一個接口的示范規格。

void* myAlloc(size_t size) {return malloc(size); } void myFree(void* ptr) {return free(ptr); }他們不能被聲明于一個namespace內 inline void* operator new(size_t size) {cout << "global new()" << endl;return myAlloc(size); }inline void operator delete(void* ptr) {cout << "global delete()" << endl;myFree(ptr); }inline void* operator new[](size_t size) {cout << "global new[]()" << endl;return myAlloc(size); } inline void operator delete[](void* ptr) {cout << "global delete[]()" << endl;myFree(); }

2、在類里面去重載

我們在類里面寫好兩個重載函數:

class Foo { public:void* operator new(size_t);void operator delete(void*,size_t); };

注意上面的delete函數的第二個參數size_t是可有可無的。
同時也需要注意,這里的operator new和 operator delete 函數是靜態的,要加上static。因為在new一個對象的時候我們手上是沒有對象的,也就是說無法通過對象調用一般的函數。加上static就可以不通過對象而直接調用這兩個函數了。這是一個細節。
在我們進行new和delete操作時,由編譯器調用:

Foo* p = new Foo; ... delete p;

編譯器將上述代碼轉換為如下格式:

try {void* mem = operator new(sizeof(Foo));p = static_cast<Foo*>(mem);//調用構造函數p->Foo::Foo(); }//調用析構函數 p->~Free(); operator delete(p);

同理array的版本如下:

Foo* p = new Foo[N]; ... delete [] p;class Foo { public:void* operator new[](size_t);void operator delete[](void*,size_t); };

總結

以上是生活随笔為你收集整理的通过从全局和类内部重载operator new /delete来获取内存管理权的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。