<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>