線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1166
推到 Plurk!
推到 Facebook!

關於函數中new的使用

答題得分者是:rick060
shiuan0610
一般會員


發表:15
回覆:13
積分:5
註冊:2007-05-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-11-24 09:32:48 IP:60.244.xxx.xxx 訂閱

[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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-11-25 08:00:57 IP:59.125.xxx.xxx 訂閱
我對這句「網路上也找不到」,很有意見
因為,可以找到的,有上千個位置

所以,也許你是在搜尋時的關鍵字,用得不恰當

以上題外話,接下來,回答你的問題

記憶體,凡是宣告 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-25 10:50:01 IP:122.146.xxx.xxx 未訂閱
若是你說手邊的書翻不到解答,我同意
因為目前國內的中文書對於一般電腦、程式、記憶體等等基礎概念寫得好的,「幾乎」沒有。
既使有"寫得好"的「原文書」翻譯本,往往是辭不達義,甚至會造成誤解
這下變成了很多人拿到書就只會猛 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結束自然消滅,不會有其他問題?

這些問題也許很淺,但我翻手邊的書翻不到解答,網路上也找不到....
先謝謝可以回答我的前輩!!
系統時間:2024-05-08 11:01:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!