日本程序开发式自定义的malloc/free函数(二)-内部式样书(内部仕様書)
这次是来写内部式样书,内部式样书我自己的认为就是相当于一个白盒,这次把盒子里是怎么得到这个返回值的所有的过程,用文字的形式进行描写,然后方便编写程序的人来参考。
但是注意,内部式样书既不能写的太详细,这样没有程序员自己发挥的空间。也不能太简略了,这样不能成为参考。
具体可以用上软件工程的流程图什么的,更方便理解,这里没有用这么专业的图,自己画了个简易流程图。
PS:如果有学弟学妹看到这个文章,这仅仅供没有头绪的小伙伴参考,不要直接复制,这样没有意义。
内部仕様書
関数,あるいはモジュールの説明
void*myAlloc(size_t elementSize){
/*
使われ方 例えば、size_t *p = (size_t*) myAlloc(sizeof(size_t));で使います;//使用方法
戻り値の型ポインタ;
戻り値の範囲成功したら、このメモリ指すポインタを戻ります;//返回值成功返回指向这个地址的指针,失败返回NULL
もし失敗したら、NULLポインタを戻ります;
正常値の範囲elementSize>0、でも大き過ぎはダメです;
モジュールや関数の機能の説明 メモリを分配することができます。 //能够分配内存
引数: elemrntSize; 何バイトのメモリを割付たいのを示します。
処理の内容
*/
void myFree(void* block){
/*
使われ方例えば、size_t *p = (size_t*) myAlloc(sizeof(size_t));…………..myFree(p); で使います;
戻り値の型なし;
戻り値の範囲 なし;
正常値の範囲 NULLではない、解放したいメモリを指すポインタ;//释放指定的指针
モジュールや関数の機能の説明 ポインタを指すメモリブロックが再利用のために解放されることができます;//能够为了再利用指定的区块
引数: 釈放したいブロックの最初のアドレス。
戻り値:なし
処理の内容:
*/
}
大域(global)変数//静态变量
static t_Header temp = NULL;//空きポインタをNULLに初期化します。
#define sizeOfBlock 24;//Headerのサイズを決めます。
新しく宣言されたレコード型(record type)の説明
typedef struct Header{
size_t elementSize //実際のブロックのサイズ
struct Header *pre,*next;// 前駆と後継ポインタ
int free;//空いているかを示し
int filling;// アドレスをアライメントしやすいため、フィラーします。//用来填充的
int *pmc//dat;を指しポインタ、アドレスの正しさを確認するように使います。//用于校验地址的
char data[1];//データブラックの最初なバイト。
}*t_Header;
テストケース
呼び出し方myAlloc(0)
結果 ゼロのメモリは割り付けられません。
呼び出し方myAlloc(-1)
結果 マイナスのメモリは割り付けられません。
呼び出し方myAlloc(9999999)
結果 大きすぎるとメモリは割り付けられません。
呼び出し方myAlloc(249)
結果1 もしあいているブラツクがあれば、メモリはが割付けらます。
結果2 もしあいているブラックがなければ、新たなブラックを作る。
呼び出し方
size_t *p1 = (size_t*)myAlloc(2);
size_t *p2= (size_t*)myAlloc(9);
size_t *p3 = (size_t*)myAlloc(29);
size_t *p4 = (size_t*)myAlloc(249);
size_t *p5 = (size_t*)myAlloc(249);
myFree(p1);
myFree(p2);
myFree(p3);
myFree(p4);
myFree(p5);
結果:見た目はフリー完了ですが、実際にブラックはまだ残ています、メモリまだ使用中です。
呼び出し方myFree (NULL)
結果 何もしません。
呼び出し方myFree (p)//(p!=null)
結果1 pのアドレスは正しいなら、メモリはが割付けらます。
結果2 pのアドレスは正しくないなら、メモリは割り付けられません。
不管是内部用例还是外部用例,测试用例都是在没编写程序的时候写的,所以与最后的实际测试的时候可能会有不同。