目錄
寫在前面
參考程式
第一版本
第二版本
第三版本
參考文獻
我們在過載的四個函式中不使用malloc,free進行模擬,而是使用記憶體鍊錶的形式,將空閒的記憶體做成鍊錶,每次開闢新記憶體的話,就將鍊錶中的乙個分配出去,如果**的話,析構物件,將記憶體重新放置回煉表中
#ifndef _screen_h_
#define _screen_h_
#include #include using namespace std;
class screen
; int get()
void* operator new(size_t);
void operator delete(void*,size_t);
private:
screen *next;
static screen *freestore;
static const int screenchunk;
private:
int i; //類中的資料
};screen* screen::freestore = 0; //指向後面的乙個
const int screen::screenchunk = 24; //放置24個大小
void *screen::operator new(size_t size)
p = freestore;
freestore = freestore->next;
return p;
}void screen::operator delete(void *p,size_t) //**到單向鍊錶中,否則呼叫系統的釋放函式,free
#endif
在第一版本中,發現有一定 不足之處,類中存在多餘的記憶體開銷,資料和記憶體指標同時存在於類中,並且每個類使用這樣的記憶體分配方式都要增加這樣乙個鍊錶,並且每次都要重寫這樣的函式,**重複度十分高,鑑於第一點,我們優化程式
#ifndef airplane_h_
#define airplane_h_
class airplane
;private:
union;
public:
unsigned long getmiles()
char gettype()
void set(unsigned long m,char t)
public:
static void* operator new(size_t size);
static void operator delete(void* deadobject,size_t size);
private:
static const int block_size; //塊大小
static airplane* headoffreelist; //鍊錶頭部 };
airplane* airplane::headoffreelist;
const int airplane::block_size = 512;
void* airplane::operator new(size_t size)
return p;
}void airplane::operator delete(void* deadobject,size_t size)
//**的資源,放回鍊錶前面
airplane* carcass =
static_cast(deadobject);
carcass->next = headoffreelist;
headoffreelist = carcass; }
#endif
第二版本中只存在指向下乙個節點的記憶體指標,或者乙個airplanerep結構,不存在記憶體浪費的現象,但是第二個版本只解決了第乙個問題,第二個問題並沒有得到解決,那麼就有了第三版本,static allocator
此版本中,我們將分配器做成其中只含有指向下乙個節點的指標的類,如果在其他類中要使用的話,直接部署到類中即可
#ifndef allocator_h_
#define allocator_h_
class _allocator
;public:
void *allocate(size_t); //分配空間,相當於前面的過載operator new函式
void deallocate(void*,size_t);
private:
obj* freestore = nullptr;
const int chunk = 5; //此大小可以根據實際情況而改變
};void* _allocator::allocate(size_t size)
p->next = nullptr;
} p = freestore; //返回的指標
freestore = freestore->next; //指向下乙個空閒的節點
return p;
}void _allocator::deallocate(void* p,size_t)
#endif
當其他類中使用的時候,即類似於這樣
class foo
static void* operator new(size_t size)
static void operator delete(void* pdead,size_t size) };
_allocator foo::myalloc; //初始化靜態物件
測試程式
int main()
for(int i =0 ;i < 23;i ++)
delete p[i];
}
輸出中我們發現,每5個即在乙個記憶體塊中,我們的記憶體過載是正確的
關於c++中記憶體我們不用改侷限在malloc,delete,free,new函式,應該向更深處去進行探索,理解大神的程式,對我們的學習是十分有幫助的。
《c++ primer plus 第五版》
《記憶體管理》 侯捷老老師
C 自定義記憶體 管理
工作中常常需要,將一些資料放到記憶體中處理,有時候資料量好大多達3g的空間。而且自己儲存都是一些指標之類的東西,每次都要new,容器中儲存的量好大,四五百萬個。而且最頭疼的就是 析構的時候要等好久才能釋放掉這個東西。查了好久 發現最流行的就是 空間換時間。說了也慚愧,在學校中沒怎麼學到高深的東西,好...
C 自定義迭代器
讓我們在示例中看乙個簡單迭代器型別的定義。我們定義乙個類模板,用來表示一段數值型別值,也可以生成指定範圍的開始和結束迭代器。這個迭代器也是模板型別,兩個模板都定義在同乙個標頭檔案 numeric range.h 中。下面是 numeric range模板的定義 template class nume...
C 中自定義異常
在寫方法時,是否遇見資料輸入的錯誤呢.如果字串格式不能轉換成整型的什麼.不過處理這些錯誤的異常,net已經都幫我們寫好了.但是如果乙個字串輸入你想判斷他是不是二進位制數.這種異常你會怎麼處理呢,返回乙個錯誤標識嗎?如果你寫的函式是二進位制轉換成十進位制 返回的值是整型.這個錯誤返回值如果標識呢.哈哈...