關於函數中new的使用 |
答題得分者是:rick060
|
shiuan0610
一般會員 發表:15 回覆:13 積分:5 註冊:2007-05-08 發送簡訊給我 |
[code cpp] void func() { int a[500]={0}; int *b = new int[500]; for(int i;i<500;i ) b[i]=0; //....中略 delete [] b; } [/code] 我想請問一下,如上程式碼,a和b有什麼不同的意義或著使用時機的差別? 因為a只是存在func裡的變數,func結束時a也會自然消滅,而且a可以直接指定初值為0,new出來的b卻不行,那寫起來似乎直接宣告a的寫法較方便。 另一個問題,如果func中,最後不delete b,b是否也會隨func結束自然消滅,不會有其他問題? 這些問題也許很淺,但我翻手邊的書翻不到解答,網路上也找不到.... 先謝謝可以回答我的前輩!! |
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
我對這句「網路上也找不到」,很有意見
因為,可以找到的,有上千個位置 所以,也許你是在搜尋時的關鍵字,用得不恰當 以上題外話,接下來,回答你的問題 記憶體,凡是宣告 new,必有釋放 delete,不然必造成記憶體 leak 所以養成習慣,凡用 new ,必有對應 delete 函式內的 a ,是「編譯器」幫你宣告,幫你釋放,同時幫你「初始化為 初始值」,這裡初始值是 0,因為是 int,各家編譯器,或不同版本,可能有不同的初始值定義,所以不可以視為理所當然,還是要注意一下 所以 a 在離開函式之後,因為自動釋放,自然,無法繼續存在 但若 b 沒有釋放,當然可以繼續用,用到你爽,用到你將之釋放,為止 (但你一定要做釋放這動作,不管在哪裡,同時只需要做一次,若有多作,表示你邏輯有誤) 最後自己宣告的,不會自動初始化,請自己「視需要」初始化,例如 FillChar(xxxx...., 0) 填 0 至於為何如此,因為,規定就是如此,你也可以自己開發一個規則不是如此的編譯器,但當下的,是這樣設計的 ===================引 用 shiuan0610 文 章=================== [code cpp] void func() { int a[500]={0}; int *b = new int[500]; for(int i;i<500;i ) b[i]=0; //....中略 delete [] b; } [/code] 我想請問一下,如上程式碼,a和b有什麼不同的意義或著使用時機的差別? 因為a只是存在func裡的變數,func結束時a也會自然消滅,而且a可以直接指定初值為0,new出來的b卻不行,那寫起來似乎直接宣告a的寫法較方便。 另一個問題,如果func中,最後不delete b,b是否也會隨func結束自然消滅,不會有其他問題? 這些問題也許很淺,但我翻手邊的書翻不到解答,網路上也找不到.... 先謝謝可以回答我的前輩!! |
rick060
高階會員 發表:2 回覆:112 積分:217 註冊:2009-11-17 發送簡訊給我 |
若是你說手邊的書翻不到解答,我同意
因為目前國內的中文書對於一般電腦、程式、記憶體等等基礎概念寫得好的,「幾乎」沒有。 既使有"寫得好"的「原文書」翻譯本,往往是辭不達義,甚至會造成誤解 這下變成了很多人拿到書就只會猛 K ,但不了解「WHY to do」與「WHEN to do」 --以上是廢話-- 但網路上,絕對有你要找的答案,只是可能在前提的條件下,讓你不知道該怎麼下關鍵字,抓不到痛處 關於你要答案,你可以找關鍵字 「dynamic memory」->就是你所謂的b 「static memory」->就是你所謂的a 而我建議你看些原文書與解釋,會比較了解其精義 而跟你的問題有相關的關鍵字也列出來給你參考: memory allocation,heap,stack,user space,memory fragmentation 第二個問題,若 b 一直不 delete ,唯一消滅它的時機只剩「程式結束」時 ===================引 用 shiuan0610 文 章=================== 我想請問一下,如上程式碼,a和b有什麼不同的意義或著使用時機的差別? 因為a只是存在func裡的變數,func結束時a也會自然消滅,而且a可以直接指定初值為0,new出來的b卻不行,那寫起來似乎直接宣告a的寫法較方便。 另一個問題,如果func中,最後不delete b,b是否也會隨func結束自然消滅,不會有其他問題? 這些問題也許很淺,但我翻手邊的書翻不到解答,網路上也找不到.... 先謝謝可以回答我的前輩!! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |