看板 C_and_CPP 關於我們 聯絡資訊
我想做的是避開 malloc / new 碎片化問題, 雖然已用其中一種方式做出來, 但在想是不是我觀念不正確,所以另一種方式做不出來, 有問題的碼如下 http://codepad.org/eNVzkv1V 用到的概念如下。 變數假設如下。 int *space1d, **space2d, ***space3d; const size_t x=2, y=3, z=4 ; 以 2d 為例,目前有二種作法, 2d-1 (malloc / free 2 次) /* allocate */ space1d = (int*)malloc(sizeof(int) * x * y); space2d = (int**)malloc(sizeof(int*)* x ); for(i=0; i<x; ++i) space2d[i]=space1d, space1d+=y; /* release */ free((void*)(*space2d)); free((void*)space2d); 2d-2 (malloc / free 1 次) /* allocate */ space2d = (int **)malloc(sizeof(int*)*x + sizeof(int)*x*y); space1d = (int *)(space2d + x); for(i=0; i<x; ++i){ space2d[i] = space1d; space1d+=y; } /* release */ free(space2d); 再以 3d 為例時 3d-1(malloc / free 3 次) /* allocate */ space1d = (int*)malloc(sizeof(int) * x * y * z); space2d = (int**)malloc(sizeof(int*) * x * y); space3d = (int***)malloc(sizeof(int**) * x); for(i=0; i<x; ++i){ space3d [i] = space2d; for(j=0; j<y; ++j){ space2d[j] = (int*)space1d; space1d+=z; } space2d+=y; } /* release */ free((void*)**space3d); free((void*)*space3d); free((void*)space3d); 3d-2(malloc / free 1 次) /* allocate */ space3d = (int ***)malloc(sizeof(int**)*x + sizeof(int*)*x*y + sizeof(int)*x*y*z); space2d = (int**)(space3d + x); space1d = (int*)(space2d + x*y ); for(i=0; i<x; ++i){ // 實體資料 space3d[i] = space2d; for(j=0; j<y; ++j){ space2d[j] = space1d; space1d+=z; } space2d+=y; } /* release */ free(space3d); 目前想要把上面的動作全都包成各函式,宣告如下。 void** new2d(const size_t X, const size_t Y, const size_t SizeOfEle); void*** new3d(const size_t X, const size_t Y, const size_t Z, const size_t SizeOfEle); 目前完成之進度如下 (沒問題的部份就不附上 code 了, 有需求的可推文, 再附上) 2d-1 (malloc 2 次) pass 2d-2 (malloc 1 次) pass 3d-1 (malloc 3 次) fail http://codepad.org/eNVzkv1V 3d-2 (malloc 1 次) pass 問題在於 3d-1 那裡,我包的 function 似乎必然會產生二個衝突問題: (1) 對 space2d 必然產生 memory leak (2) 或對 space2d 會產生重覆 free ? 硬要用這方式完成的話,是否有改善空間? 或 O( #dim ) 之 malloc 方式要包 func, 不適合用在高維度上? 先謝謝各位不吝指教!! -- 我知道 ~ 但別說出來 , 說出來讓人感到特別難過... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.161
bleed1979:13行和14行的X, X*Y 看一下。 03/24 22:27
tropical72:Orz 我為這傻事查了2天,謝謝 bleed1979 點出,感謝!! 03/24 22:31
※ 編輯: tropical72 來自: 180.177.76.161 (03/24 22:37)
loveme00835:多幾個參數傳進去, new3d call new2d, 這樣你要再來個 03/24 22:56
loveme00835:new4d 也不是問題 03/24 22:57
tropical72:!! love大說的我細思一下該怎麼做.. 03/24 23:01
loveme00835:給 elements / pointers 起始位置, 只要負責串接起來 03/24 23:09
loveme00835:再用你的 newXX 系列包起來 03/24 23:10
loveme00835:剛剛幾乎完成了, 不過看到問題解決就算了 XD 03/24 23:10
firejox:用可變參數呢 接下來就變成遞迴XD 03/24 23:11
loveme00835:recursion 簡潔很多, 但是一想到還要多傳參數就暈 03/24 23:14
tropical72:這問題真的有趣,三天後再reply,回鍋炒一次,讓我細思 ^^ 03/25 00:56
loveme00835:@@ 03/25 01:22