作者tropical72 (藍影)
看板C_and_CPP
標題[已解] allocate memory for 3 dim.
時間Sat Mar 24 21:30:28 2012
我想做的是避開 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