[問題] 這樣的coding style好不好? (new delete問題)

看板C_and_CPP (C/C++)作者 (SaoAn)時間15年前 (2011/06/21 05:14), 編輯推噓8(8036)
留言44則, 10人參與, 最新討論串1/1
大家好, 假如我的main.cpp要call一個function好幾次, 然後function需要new一堆array 算完之後要delete一堆array, 為了避免這種不必要的new和delete, 小弟我想出兩個方法 想請教各位 1. 把所有需要new和delete的array宣告在main, 然後傳進function裡, 可是這樣function 的參數量變成有點龐大...似乎不是最佳解. 以下是例子 //main.cpp int main() { int *in, *out, *mid1, ....*midn; new以上 func(in, out, mid, ...midn); free掉 } 2. 把所有需要new和delete的array宣告成function的global variable, 然後寫一個new 函式和delete函式, 這樣似乎可以解決問題, 但是新手誡條裡面說盡量不要用global variable, 請問我這樣做有什麼壞處嗎? 以下是例子 //main.cpp int main() { int *in, *out; new以上 func_new(); //需要傳進array的大小 這裡省略 func(in, out); func_del(); free掉 } //func.cpp 全域宣告 int *mid1, .......,*midn; void func(int *in, int *out) { 幹些事情 } void func_new() { new那些全域變數 } void func_del() { delete那些全域變數 } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 137.110.111.129 ※ 編輯: genghiskii 來自: 137.110.111.129 (06/21 05:15)

06/21 06:11, , 1F
其實你的第二方案就很不錯了
06/21 06:11, 1F

06/21 06:11, , 2F
儘量不用全域變數的理由是你無法控制誰會去修改這個變數
06/21 06:11, 2F

06/21 06:11, , 3F
但看你的架構似乎 func 這個函式是寫在另一個 .cpp 裡的
06/21 06:11, 3F

06/21 06:12, , 4F
這樣一來只要些全域變數沒有 extern
06/21 06:12, 4F

06/21 06:12, , 5F
能看得到的就只有這個檔案裡的函式
06/21 06:12, 5F

06/21 06:13, , 6F
於是只要你確定在這個檔案的函式裡沒有動到的話就沒有關係了
06/21 06:13, 6F

06/21 06:13, , 7F
這個概念發展下去可以和物件導向的資料封裝扯上一點點關係
06/21 06:13, 7F

06/21 06:14, , 8F
不過這裡就暫時不討論這方面就是了
06/21 06:14, 8F

06/21 06:35, , 9F
非常感謝LPH66大大的說明
06/21 06:35, 9F

06/21 06:59, , 10F
雙重指標可能是另一個好選擇...
06/21 06:59, 10F

06/21 08:36, , 11F
我覺得要看語義。
06/21 08:36, 11F

06/21 08:37, , 12F
如果不看語義的話,我覺得 <1> 才比較容易的復用你的函式
06/21 08:37, 12F

06/21 08:38, , 13F
用二的話,你想重用,會被一堆Global Variable卡到。
06/21 08:38, 13F

06/21 08:39, , 14F
當然,如果有上面所說的資料封裝的話,也會是好選擇。
06/21 08:39, 14F

06/21 08:50, , 15F
可以把這些變數改成struct,一次開,一次刪.當然這算投機
06/21 08:50, 15F

06/21 08:51, , 16F
不是好方法,以程式習慣來看1是最好的方法,新增空間和刪
06/21 08:51, 16F

06/21 08:52, , 17F
除空間在同一level上.好控制好debug.
06/21 08:52, 17F

06/21 09:27, , 18F
我個人是有把一個 .cpp (即一個 compilation unit)
06/21 09:27, 18F

06/21 09:28, , 19F
看成一個黑盒子的看法啦 感覺上這就是 C 時代的資料封裝
06/21 09:28, 19F

06/21 09:29, , 20F
所以我這些看法也是在這個觀念下出來的
06/21 09:29, 20F

06/21 09:34, , 21F
別誤會,我的出發點是在撰寫一個lib的函式,如果任由函式
06/21 09:34, 21F

06/21 09:35, , 22F
可以新增空間,會造成後續麻煩,我覺得這偏向設計的理念
06/21 09:35, 22F

06/21 09:36, , 23F
因為我沒寫過資料封裝,所以我當然無法給予2的建言
06/21 09:36, 23F

06/21 12:06, , 24F
了解...其實如果要寫 lib 我會傾向原 PO 第一段的方法
06/21 12:06, 24F

06/21 12:59, , 25F
選1呀 看看那些source code 哪個不是一堆輸入參數 = =
06/21 12:59, 25F

06/21 14:15, , 26F
全域變數能少用儘量少用
06/21 14:15, 26F

06/21 15:46, , 27F
用struct應該可以滿足你的需要吧
06/21 15:46, 27F

06/21 17:00, , 28F
http://pastie.org/2100460 <--struct用法,這是折衷1和2
06/21 17:00, 28F

06/21 17:01, , 29F
但是問題是每個member variable開的空間一定一樣嘛?
06/21 17:01, 29F

06/21 17:04, , 30F
ps:勿筆戰,因為樓主應該是可能其它因素,才不用struct
06/21 17:04, 30F

06/21 17:04, , 31F
所以我才覺得此方法有點投機.因此下一篇講解2的方法
06/21 17:04, 31F

06/21 17:05, , 32F
也可以採納.
06/21 17:05, 32F

06/21 18:08, , 33F
其實宣告成那樣很噁心 -->mid1~n
06/21 18:08, 33F

06/21 18:08, , 34F
因為你意味著那些相差不大 都是屬於mid類的...
06/21 18:08, 34F

06/21 18:10, , 35F
我則會建議你就把那些換成雙重指標或者指標陣列....
06/21 18:10, 35F

06/21 18:10, , 36F
假如要不一樣 就用void*(燦笑
06/21 18:10, 36F

06/21 19:40, , 37F
firejox嚇到我,下次要標明是糾正誰喔,我之前常去的論壇
06/21 19:40, 37F

06/21 19:40, , 38F
就是有類似的問題,最近一直陷入口水戰.
06/21 19:40, 38F

06/21 20:41, , 39F
sorry :)
06/21 20:41, 39F

06/21 20:45, , 40F
標明一下:void*是給angel大的 其他是給原PO的
06/21 20:45, 40F

06/21 20:47, , 41F
天使大
06/21 20:47, 41F

06/21 20:54, , 42F
打錯XDD
06/21 20:54, 42F

06/21 20:55, , 43F
QQ哼
06/21 20:55, 43F

06/21 23:34, , 44F
XDDDDDD大家好可愛
06/21 23:34, 44F
文章代碼(AID): #1D_xX7UG (C_and_CPP)
文章代碼(AID): #1D_xX7UG (C_and_CPP)