[已解] allocate memory for 3 dim.

看板C_and_CPP作者 (藍影)時間13年前 (2012/03/24 21:30), 編輯推噓0(0012)
留言12則, 4人參與, 最新討論串1/2 (看更多)
我想做的是避開 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

03/24 22:27, , 1F
13行和14行的X, X*Y 看一下。
03/24 22:27, 1F

03/24 22:31, , 2F
Orz 我為這傻事查了2天,謝謝 bleed1979 點出,感謝!!
03/24 22:31, 2F
※ 編輯: tropical72 來自: 180.177.76.161 (03/24 22:37)

03/24 22:56, , 3F
多幾個參數傳進去, new3d call new2d, 這樣你要再來個
03/24 22:56, 3F

03/24 22:57, , 4F
new4d 也不是問題
03/24 22:57, 4F

03/24 23:01, , 5F
!! love大說的我細思一下該怎麼做..
03/24 23:01, 5F

03/24 23:09, , 6F
給 elements / pointers 起始位置, 只要負責串接起來
03/24 23:09, 6F

03/24 23:10, , 7F
再用你的 newXX 系列包起來
03/24 23:10, 7F

03/24 23:10, , 8F
剛剛幾乎完成了, 不過看到問題解決就算了 XD
03/24 23:10, 8F

03/24 23:11, , 9F
用可變參數呢 接下來就變成遞迴XD
03/24 23:11, 9F

03/24 23:14, , 10F
recursion 簡潔很多, 但是一想到還要多傳參數就暈
03/24 23:14, 10F

03/25 00:56, , 11F
這問題真的有趣,三天後再reply,回鍋炒一次,讓我細思 ^^
03/25 00:56, 11F

03/25 01:22, , 12F
@@
03/25 01:22, 12F
文章代碼(AID): #1FRSnur3 (C_and_CPP)
文章代碼(AID): #1FRSnur3 (C_and_CPP)