差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

后一修订版
前一修订版
3.dokuwiki功能测试区:增加保密意识_筑牢保密防线 [2018/11/09 17:50]
222.178.16.114 创建
3.dokuwiki功能测试区:增加保密意识_筑牢保密防线 [2019/07/15 11:42] (当前版本)
111.198.130.98
行 1: 行 1:
-<​p>​fdcgvbdfgfdgdfgfdgdfgdfgdfgdfg</​p>​+<p style="​line-height:​ 16px;"><​img src="​http://​www.dokuwiki.com.cn:​8885/​test/​bootstrap/​ueditor/​dialogs/​attachment/​fileTypeImages/​icon_doc.gif"/><​a style="​font-size:​12px;​ color:#​0066cc;"​ href="/​test_images/​ueditor/​php/​upload/​file/​20180115/​1515981887637214.doc"​ title="​1515981887637214.doc">​1515981887637214.doc</​a></​p><​p style="​line-height:​ 16px;">​fdcgvbdfgfdgdfgfdgdfgdfgdfgdfg<​br/></​p><​pre class="​brush:​cpp;​toolbar:​false">//&​nbsp;​author&​nbsp;:&​nbsp;​Hou&​nbsp;​Jie&​nbsp;​(侯捷) 
 +//&​nbsp;​date&​nbsp;:&​nbsp;​2015/​11/​11&​nbsp;​ 
 +//&​nbsp;​compiler&​nbsp;:&​nbsp;​DevC++&​nbsp;​5.61&​nbsp;​(MinGW&​nbsp;​with&​nbsp;​GNU&​nbsp;​4.9.2) 
 +// 
 +//&​nbsp;​說明:這是侯捷&​nbsp;​E-learning&​nbsp;​video&​nbsp;&​quot;​C++內存管理&​quot;&​nbsp;​的實例程式. 
 +// 
 +//&​nbsp;​filename&​nbsp;:&​nbsp;​allocc.h 
 +//&​nbsp;​取材自&​nbsp;​SGI&​nbsp;​STL&​nbsp;​2.91&​nbsp;&​lt;​stl_alloc.h&​gt;,&​nbsp;​移植至&​nbsp;​C&​nbsp;​language. 
 +#​include&​nbsp;&​lt;​stdlib.h&​gt;&​nbsp;&​nbsp;//​for&​nbsp;​malloc(),​realloc() 
 +#​include&​nbsp;&​lt;​stddef.h&​gt;&​nbsp;&​nbsp;//​for&​nbsp;​size_t 
 +#​include&​nbsp;&​lt;​memory.h&​gt;&​nbsp;&​nbsp;//​for&​nbsp;​memcpy() 
 +//#​define&​nbsp;​__THROW_BAD_ALLOC&​nbsp;&​nbsp;&​nbsp;​cerr&​nbsp;&​lt;&​lt;&​nbsp;&​quot;​out&​nbsp;​of&​nbsp;​memory&​quot;&​nbsp;&​lt;&​lt;&​nbsp;​endl;&​nbsp;​exit(1) 
 +#​define&​nbsp;​__THROW_BAD_ALLOC&​nbsp;&​nbsp;&​nbsp;​exit(1) 
 + 
 +//​---------------------------------------------- 
 +//&​nbsp;​第1級配置器。 
 +//​---------------------------------------------- 
 + 
 +void&​nbsp;​(*oom_handler)()&​nbsp;​=&​nbsp;​0;​ 
 +void*&​nbsp;​oom_malloc(size_t&​nbsp;​n) 
 +
 +&​nbsp;&​nbsp;​void&​nbsp;​(*my_malloc_handler)();​ 
 +&​nbsp;&​nbsp;​void*&​nbsp;​result;​ 
 + 
 +&​nbsp;&​nbsp;​for&​nbsp;​(;;​)&​nbsp;​{&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​不斷嘗試釋放、配置、再釋放、再配置… 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​my_malloc_handler&​nbsp;​=&​nbsp;​oom_handler;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(0&​nbsp;​==&​nbsp;​my_malloc_handler)&​nbsp;​{&​nbsp;​__THROW_BAD_ALLOC;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​(*my_malloc_handler)();&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​呼叫處理常式,企圖釋放記憶體 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​result&​nbsp;​=&​nbsp;​malloc(n);&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​再次嘗試配置記憶體 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(result)&​nbsp;​return(result);​ 
 +&​nbsp;&​nbsp;​} 
 +
 + 
 +void*&​nbsp;​oom_realloc(void&​nbsp;​*p,&​nbsp;​size_t&​nbsp;​n) 
 +
 +&​nbsp;&​nbsp;​void&​nbsp;​(*my_malloc_handler)();​ 
 +&​nbsp;&​nbsp;​void*&​nbsp;​result;​ 
 +&​nbsp;&​nbsp;​for&​nbsp;​(;;​)&​nbsp;​{&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​不斷嘗試釋放、配置、再釋放、再配置… 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​my_malloc_handler&​nbsp;​=&​nbsp;​oom_handler;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(0&​nbsp;​==&​nbsp;​my_malloc_handler)&​nbsp;​{&​nbsp;​__THROW_BAD_ALLOC;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​(*my_malloc_handler)();&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​呼叫處理常式,企圖釋放記憶體。 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​result&​nbsp;​=&​nbsp;​realloc(p,&​nbsp;​n);&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​再次嘗試配置記憶體。 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(result)&​nbsp;​return(result);​ 
 +&​nbsp;&​nbsp;​} 
 +
 +void*&​nbsp;​malloc_allocate(size_t&​nbsp;​n) 
 +
 +&​nbsp;&​nbsp;​void&​nbsp;​*result&​nbsp;​=&​nbsp;​malloc(n);&​nbsp;&​nbsp;&​nbsp;//​直接使用&​nbsp;​malloc() 
 +&​nbsp;&​nbsp;​if&​nbsp;​(0&​nbsp;​==&​nbsp;​result)&​nbsp;​result&​nbsp;​=&​nbsp;​oom_malloc(n);​ 
 +&​nbsp;&​nbsp;​return&​nbsp;​result;​ 
 +
 +void&​nbsp;​malloc_deallocate(void*&​nbsp;​p,&​nbsp;​size_t&​nbsp;​n) 
 +
 +&​nbsp;&​nbsp;​free(p);&​nbsp;&​nbsp;//​直接使用&​nbsp;​free() 
 +
 +void*&​nbsp;​malloc_reallocate(void&​nbsp;​*p,&​nbsp;​size_t&​nbsp;​old_sz,&​nbsp;​size_t&​nbsp;​new_sz) 
 +
 +&​nbsp;&​nbsp;​void*&​nbsp;​result&​nbsp;​=&​nbsp;​realloc(p,&​nbsp;​new_sz);&​nbsp;//​直接使用&​nbsp;​realloc() 
 +&​nbsp;&​nbsp;​if&​nbsp;​(0&​nbsp;​==&​nbsp;​result)&​nbsp;​result&​nbsp;​=&​nbsp;​oom_realloc(p,&​nbsp;​new_sz);​ 
 +&​nbsp;&​nbsp;​return&​nbsp;​result;​ 
 +
 +void&​nbsp;​(*set_malloc_handler(void&​nbsp;​(*f)()))() 
 +{&​nbsp;//​類似&​nbsp;​C++&​nbsp;​的&​nbsp;​set_new_handler(). 
 +&​nbsp;&​nbsp;​void&​nbsp;​(*old)()&​nbsp;​=&​nbsp;​oom_handler;​ 
 +&​nbsp;&​nbsp;​oom_handler&​nbsp;​=&​nbsp;​f;​ 
 +&​nbsp;&​nbsp;​return(old);​ 
 +
 +//​---------------------------------------------- 
 +//​第二級配置器 
 +//​---------------------------------------------- 
 +enum&​nbsp;​{__ALIGN&​nbsp;​=&​nbsp;​8};&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​小區塊的上調邊界 
 +enum&​nbsp;​{__MAX_BYTES&​nbsp;​=&​nbsp;​128};&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​小區塊的上限 
 +enum&​nbsp;​{__NFREELISTS&​nbsp;​=&​nbsp;​__MAX_BYTES/​__ALIGN};&​nbsp;//​free-lists&​nbsp;​個數 
 +//&​nbsp;​union&​nbsp;​obj&​nbsp;​{&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​G291[o],​CB5[x],​VC6[x] 
 +//&​nbsp;&​nbsp;&​nbsp;​union&​nbsp;​obj*&​nbsp;​free_list_link;&​nbsp;&​nbsp;//​這麼寫在&​nbsp;​VC6&​nbsp;​和&​nbsp;​CB5&​nbsp;​中也可以, 
 +//&​nbsp;​};&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​但以後就得使用&​nbsp;&​quot;​union&​nbsp;​obj&​quot;&​nbsp;​而不能只寫&​nbsp;&​quot;​obj&​quot;​ 
 +typedef&​nbsp;​struct&​nbsp;​__obj&​nbsp;​{ 
 +&​nbsp;&​nbsp;​struct&​nbsp;​__obj*&​nbsp;​free_list_link;​ 
 +}&​nbsp;​obj;​ 
 +char*&​nbsp;&​nbsp;&​nbsp;​start_free&​nbsp;​=&​nbsp;​0;​ 
 +char*&​nbsp;&​nbsp;&​nbsp;​end_free&​nbsp;​=&​nbsp;​0;​ 
 +size_t&​nbsp;&​nbsp;​heap_size&​nbsp;​=&​nbsp;​0;​ 
 +obj*&​nbsp;​free_list[__NFREELISTS] 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​=&​nbsp;​{0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0,&​nbsp;​0&​nbsp;​};​ 
 +size_t&​nbsp;​ROUND_UP(size_t&​nbsp;​bytes)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return&​nbsp;​(((bytes)&​nbsp;​+&​nbsp;​__ALIGN-1)&​nbsp;&​amp;&​nbsp;​~(__ALIGN&​nbsp;​-&​nbsp;​1));​ 
 +
 +size_t&​nbsp;​FREELIST_INDEX(size_t&​nbsp;​bytes)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return&​nbsp;​(((bytes)&​nbsp;​+&​nbsp;​__ALIGN-1)/​__ALIGN&​nbsp;​-&​nbsp;​1);​ 
 +
 +//​---------------------------------------------- 
 +//&​nbsp;​We&​nbsp;​allocate&​nbsp;​memory&​nbsp;​in&​nbsp;​large&​nbsp;​chunks&​nbsp;​in&​nbsp;​order&​nbsp;​to 
 +//&​nbsp;​avoid&​nbsp;​fragmentingthe&​nbsp;​malloc&​nbsp;​heap&​nbsp;​too&​nbsp;​much. 
 +//&​nbsp;​We&​nbsp;​assume&​nbsp;​that&​nbsp;​size&​nbsp;​is&​nbsp;​properly&​nbsp;​aligned. 
 +// 
 +//&​nbsp;​Allocates&​nbsp;​a&​nbsp;​chunk&​nbsp;​for&​nbsp;​nobjs&​nbsp;​of&​nbsp;​size&​nbsp;&​quot;​size&​quot;​. 
 +//&​nbsp;​nobjs&​nbsp;​may&​nbsp;​be&​nbsp;​reduced&​nbsp;​if&​nbsp;​it&​nbsp;​is&​nbsp;​inconvenient&​nbsp;​to 
 +//&​nbsp;​allocate&​nbsp;​the&​nbsp;​requested&​nbsp;​number. 
 +//​---------------------------------------------- 
 +//​char*&​nbsp;​chunk_alloc(size_t&​nbsp;​size,&​nbsp;​int&​amp;&​nbsp;​nobjs)&​nbsp;&​nbsp;//​G291[o],​VC6[x],​CB5[x] 
 +char*&​nbsp;​chunk_alloc(size_t&​nbsp;​size,&​nbsp;​int*&​nbsp;​nobjs) 
 +
 +&​nbsp;&​nbsp;​char*&​nbsp;​result;​ 
 +&​nbsp;&​nbsp;​size_t&​nbsp;​total_bytes&​nbsp;​=&​nbsp;​size&​nbsp;​*&​nbsp;​(*nobjs);&​nbsp;&​nbsp;&​nbsp;//​原&​nbsp;​nobjs&​nbsp;​改為&​nbsp;​(*nobjs) 
 +&​nbsp;&​nbsp;​size_t&​nbsp;​bytes_left&​nbsp;​=&​nbsp;​end_free&​nbsp;​-&​nbsp;​start_free;​ 
 + 
 +&​nbsp;&​nbsp;​if&​nbsp;​(bytes_left&​nbsp;&​gt;​=&​nbsp;​total_bytes)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​result&​nbsp;​=&​nbsp;​start_free;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​start_free&​nbsp;​+=&​nbsp;​total_bytes;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return(result);​ 
 +&​nbsp;&​nbsp;​}&​nbsp;​else&​nbsp;​if&​nbsp;​(bytes_left&​nbsp;&​gt;​=&​nbsp;​size)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​*nobjs&​nbsp;​=&​nbsp;​bytes_left&​nbsp;/&​nbsp;​size;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​原&​nbsp;​nobjs&​nbsp;​改為&​nbsp;​(*nobjs) 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​total_bytes&​nbsp;​=&​nbsp;​size&​nbsp;​*&​nbsp;​(*nobjs);&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​原&​nbsp;​nobjs&​nbsp;​改為&​nbsp;​(*nobjs) 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​result&​nbsp;​=&​nbsp;​start_free;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​start_free&​nbsp;​+=&​nbsp;​total_bytes;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return(result);​ 
 +&​nbsp;&​nbsp;​}&​nbsp;​else&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​size_t&​nbsp;​bytes_to_get&​nbsp;​= 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​2&​nbsp;​*&​nbsp;​total_bytes&​nbsp;​+&​nbsp;​ROUND_UP(heap_size&​nbsp;&​gt;&​gt;&​nbsp;​4);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//&​nbsp;​Try&​nbsp;​to&​nbsp;​make&​nbsp;​use&​nbsp;​of&​nbsp;​the&​nbsp;​left-over&​nbsp;​piece. 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(bytes_left&​nbsp;&​gt;&​nbsp;​0)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​obj*&​nbsp;​volatile&​nbsp;​*my_free_list&​nbsp;​= 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​free_list&​nbsp;​+&​nbsp;​FREELIST_INDEX(bytes_left);​ 
 + 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​((obj*)start_free)-&​gt;​free_list_link&​nbsp;​=&​nbsp;​*my_free_list;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​*my_free_list&​nbsp;​=&​nbsp;​(obj*)start_free;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​start_free&​nbsp;​=&​nbsp;​(char*)malloc(bytes_to_get);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(0&​nbsp;​==&​nbsp;​start_free)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​int&​nbsp;​i;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​obj*&​nbsp;​volatile&​nbsp;​*my_free_list,&​nbsp;​*p;​ 
 + 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​Try&​nbsp;​to&​nbsp;​make&​nbsp;​do&​nbsp;​with&​nbsp;​what&​nbsp;​we&​nbsp;​have.&​nbsp;​That&​nbsp;​can&#​39;​t 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​hurt.&​nbsp;​We&​nbsp;​do&​nbsp;​not&​nbsp;​try&​nbsp;​smaller&​nbsp;​requests,&​nbsp;​since&​nbsp;​that&​nbsp;​tends 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​to&​nbsp;​result&​nbsp;​in&​nbsp;​disaster&​nbsp;​on&​nbsp;​multi-process&​nbsp;​machines. 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​for&​nbsp;​(i&​nbsp;​=&​nbsp;​size;&​nbsp;​i&​nbsp;&​lt;​=&​nbsp;​__MAX_BYTES;&​nbsp;​i&​nbsp;​+=&​nbsp;​__ALIGN)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​my_free_list&​nbsp;​=&​nbsp;​free_list&​nbsp;​+&​nbsp;​FREELIST_INDEX(i);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​p&​nbsp;​=&​nbsp;​*my_free_list;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(0&​nbsp;​!=&​nbsp;​p)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​*my_free_list&​nbsp;​=&​nbsp;​p&​nbsp;​-&​gt;&​nbsp;​free_list_link;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​start_free&​nbsp;​=&​nbsp;​(char*)p;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​end_free&​nbsp;​=&​nbsp;​start_free&​nbsp;​+&​nbsp;​i;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return(chunk_alloc(size,&​nbsp;​nobjs));​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​Any&​nbsp;​leftover&​nbsp;​piece&​nbsp;​will&​nbsp;​eventually&​nbsp;​make&​nbsp;​it&​nbsp;​to&​nbsp;​the 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​right&​nbsp;​free&​nbsp;​list. 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​end_free&​nbsp;​=&​nbsp;​0;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​In&​nbsp;​case&​nbsp;​of&​nbsp;​exception. 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​start_free&​nbsp;​=&​nbsp;​(char*)malloc_allocate(bytes_to_get);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​This&​nbsp;​should&​nbsp;​either&​nbsp;​throw&​nbsp;​an&​nbsp;​exception&​nbsp;​or 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​remedy&​nbsp;​the&​nbsp;​situation.&​nbsp;​Thus&​nbsp;​we&​nbsp;​assume&​nbsp;​it 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​succeeded. 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​heap_size&​nbsp;​+=&​nbsp;​bytes_to_get;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​end_free&​nbsp;​=&​nbsp;​start_free&​nbsp;​+&​nbsp;​bytes_to_get;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return(chunk_alloc(size,&​nbsp;​nobjs));​ 
 +&​nbsp;&​nbsp;​} 
 +
 +//​---------------------------------------------- 
 +//&​nbsp;​Returns&​nbsp;​an&​nbsp;​object&​nbsp;​of&​nbsp;​size&​nbsp;​n,&​nbsp;​and&​nbsp;​optionally&​nbsp;​adds 
 +//&​nbsp;​to&​nbsp;​size&​nbsp;​n&​nbsp;​free&​nbsp;​list.&​nbsp;​We&​nbsp;​assume&​nbsp;​that&​nbsp;​n&​nbsp;​is&​nbsp;​properly&​nbsp;​aligned. 
 +//&​nbsp;​We&​nbsp;​hold&​nbsp;​the&​nbsp;​allocation&​nbsp;​lock. 
 +//​---------------------------------------------- 
 +void*&​nbsp;​refill(size_t&​nbsp;​n) 
 +
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​int&​nbsp;​nobjs&​nbsp;​=&​nbsp;​20;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​char*&​nbsp;​chunk&​nbsp;​=&​nbsp;​chunk_alloc(n,&​amp;​nobjs);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​obj*&​nbsp;​volatile&​nbsp;​*my_free_list;&​nbsp;&​nbsp;&​nbsp;//​obj**&​nbsp;​my_free_list;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​obj*&​nbsp;​result;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​obj*&​nbsp;​current_obj;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​obj*&​nbsp;​next_obj;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​int&​nbsp;​i;​ 
 + 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(1&​nbsp;​==&​nbsp;​nobjs)&​nbsp;​return(chunk);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​my_free_list&​nbsp;​=&​nbsp;​free_list&​nbsp;​+&​nbsp;​FREELIST_INDEX(n);​ 
 + 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​Build&​nbsp;​free&​nbsp;​list&​nbsp;​in&​nbsp;​chunk 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​result&​nbsp;​=&​nbsp;​(obj*)chunk;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​*my_free_list&​nbsp;​=&​nbsp;​next_obj&​nbsp;​=&​nbsp;​(obj*)(chunk&​nbsp;​+&​nbsp;​n);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​for&​nbsp;​(i=1;&​nbsp;&​nbsp;;&​nbsp;​++i)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​current_obj&​nbsp;​=&​nbsp;​next_obj;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​next_obj&​nbsp;​=&​nbsp;​(obj*)((char*)next_obj&​nbsp;​+&​nbsp;​n);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​if&​nbsp;​(nobjs-1&​nbsp;​==&​nbsp;​i)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​current_obj-&​gt;​free_list_link&​nbsp;​=&​nbsp;​0;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​break;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​}&​nbsp;​else&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​current_obj-&​gt;​free_list_link&​nbsp;​=&​nbsp;​next_obj;​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return(result);​ 
 +
 +//​---------------------------------------------- 
 +// 
 +//​---------------------------------------------- 
 +void*&​nbsp;​allocate(size_t&​nbsp;​n)&​nbsp;&​nbsp;//​n&​nbsp;​must&​nbsp;​be&​nbsp;&​gt;&​nbsp;​0 
 +
 +&​nbsp;&​nbsp;​obj*&​nbsp;​volatile&​nbsp;​*my_free_list;&​nbsp;&​nbsp;&​nbsp;&​nbsp;//​obj**&​nbsp;​my_free_list;​ 
 +&​nbsp;&​nbsp;​obj*&​nbsp;​result;​ 
 + 
 +&​nbsp;&​nbsp;​if&​nbsp;​(n&​nbsp;&​gt;&​nbsp;​(size_t)__MAX_BYTES)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return(malloc_allocate(n));​ 
 +&​nbsp;&​nbsp;​} 
 + 
 +&​nbsp;&​nbsp;​my_free_list&​nbsp;​=&​nbsp;​free_list&​nbsp;​+&​nbsp;​FREELIST_INDEX(n);​ 
 +&​nbsp;&​nbsp;​result&​nbsp;​=&​nbsp;​*my_free_list;​ 
 +&​nbsp;&​nbsp;​if&​nbsp;​(result&​nbsp;​==&​nbsp;​0)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​void*&​nbsp;​r&​nbsp;​=&​nbsp;​refill(ROUND_UP(n));​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return&​nbsp;​r;​ 
 +&​nbsp;&​nbsp;​} 
 + 
 +&​nbsp;&​nbsp;​*my_free_list&​nbsp;​=&​nbsp;​result-&​gt;​free_list_link;​ 
 +&​nbsp;&​nbsp;​return&​nbsp;​(result);​ 
 +
 +//​---------------------------------------------- 
 +// 
 +//​---------------------------------------------- 
 +void&​nbsp;​deallocate(void&​nbsp;​*p,&​nbsp;​size_t&​nbsp;​n)&​nbsp;&​nbsp;//​p&​nbsp;​may&​nbsp;​not&​nbsp;​be&​nbsp;​0 
 +
 +&​nbsp;&​nbsp;​obj*&​nbsp;​q&​nbsp;​=&​nbsp;​(obj*)p;​ 
 +&​nbsp;&​nbsp;​obj*&​nbsp;​volatile&​nbsp;​*my_free_list;&​nbsp;&​nbsp;&​nbsp;//​obj**&​nbsp;​my_free_list;​ 
 + 
 +&​nbsp;&​nbsp;​if&​nbsp;​(n&​nbsp;&​gt;&​nbsp;​(size_t)&​nbsp;​__MAX_BYTES)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​malloc_deallocate(p,&​nbsp;​n);​ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return;​ 
 +&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;​my_free_list&​nbsp;​=&​nbsp;​free_list&​nbsp;​+&​nbsp;​FREELIST_INDEX(n);​ 
 +&​nbsp;&​nbsp;​q-&​gt;​free_list_link&​nbsp;​=&​nbsp;​*my_free_list;​ 
 +&​nbsp;&​nbsp;​*my_free_list&​nbsp;​=&​nbsp;​q;​ 
 +
 +//​---------------------------------------------- 
 +// 
 +//​---------------------------------------------- 
 +void*&​nbsp;​reallocate(void&​nbsp;​*p,&​nbsp;​size_t&​nbsp;​old_sz,&​nbsp;​size_t&​nbsp;​new_sz) 
 +
 +&​nbsp;&​nbsp;​void&​nbsp;​*&​nbsp;​result;​ 
 +&​nbsp;&​nbsp;​size_t&​nbsp;​copy_sz;​ 
 + 
 +&​nbsp;&​nbsp;​if&​nbsp;​(old_sz&​nbsp;&​gt;&​nbsp;​(size_t)&​nbsp;​__MAX_BYTES&​nbsp;&​amp;&​amp;&​nbsp;​new_sz&​nbsp;&​gt;&​nbsp;​(size_t)&​nbsp;​__MAX_BYTES)&​nbsp;​{ 
 +&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;&​nbsp;​return(realloc(p,&​nbsp;​new_sz));​ 
 +&​nbsp;&​nbsp;​} 
 +&​nbsp;&​nbsp;​if&​nbsp;​(ROUND_UP(old_sz)&​nbsp;​==&​nbsp;​ROUND_UP(new_sz))&​nbsp;​return(p);​ 
 +&​nbsp;&​nbsp;​result&​nbsp;​=&​nbsp;​allocate(new_sz);​ 
 +&​nbsp;&​nbsp;​copy_sz&​nbsp;​=&​nbsp;​new_sz&​nbsp;&​gt;&​nbsp;​old_sz?&​nbsp;​old_sz&​nbsp;:&​nbsp;​new_sz;​ 
 +&​nbsp;&​nbsp;​memcpy(result,&​nbsp;​p,&​nbsp;​copy_sz);​ 
 +&​nbsp;&​nbsp;​deallocate(p,&​nbsp;​old_sz);​ 
 +&​nbsp;&​nbsp;​return(result);​ 
 +
 +//​----------------------------------------------</​pre><​p style="​line-height:​ 16px;"><​br/>​</p>