回傳的指標記憶體如何清除? |
答題得分者是:鈴鐺
|
tomex.ou
一般會員 發表:8 回覆:54 積分:22 註冊:2005-05-05 發送簡訊給我 |
我寫了一個Class(名稱:Convert),
裏頭有個靜態method專門回傳一個char指標
而它指定一個存在的記憶體,
每呼叫一次各指向不同的記憶體。
void ToCharArray(AnsiString s) { char* c = new char[strlen(s) 1]; strcpy(c, s.c_str()); return c; }因此我每呼叫一次,它的記憶體都存在: char* c1 = Convert::ToCharArray("test1"); char* c2 = Convert::ToCharArray("test2"); char* c3 = Convert::ToCharArray("test3"); 由於在外部使用,user不可能知道要delete c1,c2,c3 那也不直覺。 我知道有new記憶體就永遠存在,想用array又事先不曉得長度 請問我想怎麼做,才能達到很直覺使用,又不會浪費記憶體呢? -- Level: A newbie of C Book: The Complete Reference C
------
A fan of C#.NET |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
引言:另。你這個函數跟 .c_str(); 有什麼不同????void ToCharArray(AnsiString s) { char* c = new char[strlen(s) 1]; strcpy(c, s.c_str()); return c; }因此我每呼叫一次,它的記憶體都存在: char* c1 = Convert::ToCharArray("test1"); char* c2 = Convert::ToCharArray("test2"); char* c3 = Convert::ToCharArray("test3"); delete [] c1; delete [] c2; delete [] c3; |
鈴鐺
初階會員 發表:33 回覆:81 積分:35 註冊:2002-03-13 發送簡訊給我 |
看起來和 c_str() 很像, 不過我實務上發現, c_str() 只能在當時用一下, 隔幾行程式碼後, 那個傳回的指標就被 compiler 自動 free 掉, (可以開 code guard 看看). 我想到這題解法要用 class, 每次 new 的指標記錄在自己的 link list 裡, 最後脫離時再運用 class deconstuctor free 掉. 不過我建議較好的做法是在此函數的說明處, 請 user 自己 free 掉.
因為像標準函數 strdup 也是請 user 自行 free.
|
tomex.ou
一般會員 發表:8 回覆:54 積分:22 註冊:2005-05-05 發送簡訊給我 |
引言: 看起來和 c_str() 很像, 不過我實務上發現, c_str() 只能在當時用一下, 隔幾行程式碼後, 那個傳回的指標就被 compiler 自動 free 掉, (可以開 code guard 看看).嗯,這正是我創造這個method的動機 就是解決掉c_str()暫時性記憶空間的特性! 看來要實作類似GC回收機制,但目前我就先用說明 請user自行delete掉吧! 謝謝回覆者們。 -- Level: A newbie of C Book: The Complete Reference C
------
A fan of C#.NET |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |