全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1675
推到 Plurk!
推到 Facebook!

簡單的變數宣告 new 或 不用 new

答題得分者是:aftcast
alumi
一般會員


發表:1
回覆:1
積分:0
註冊:2004-01-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-07-16 04:06:10 IP:114.46.xxx.xxx 訂閱
void function1()
{
String Str;
do domething here .....
}

void function2()
{
String *Str = new String;
do domething here .....

delete Str ;
}

2種宣告方法 結果都一樣運作OK

不太確定 編譯器 是否呼叫函式1後
宣告的變數 完成後 會自動釋放宣告配置的記憶體

還是要用 new 的方式 然後 delete
我認為 有 new 跟 delete 我比較能把握記憶體真的被釋放

但是 宣告都要 new delete 很麻煩
不知道是不是我多慮

有人比較過嗎?

herbert2
尊榮會員


發表:58
回覆:640
積分:894
註冊:2004-04-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-07-16 16:00:58 IP:211.72.xxx.xxx 訂閱
通常基本型別: AnsiString(或 String), int, diuble ... 等等, 及直接擺在 Form 上的 Component 不需要使用 new,
而 TStrings, char[] 等, 及 Run-Time 創建的 Component 則必須使用 new.
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-07-18 23:46:17 IP:59.115.xxx.xxx 訂閱
你好,

你的問題真的是多慮了。從理論上來說Strin這個類別不用new才是最快最好的方法,而我曾實測與反組譯的結果也是如理論一樣的結果。所以,放心用!

new與不new差在物件的資料成員是否建構在heap上或stack上。若是stack上,即不new的情形,編譯器是會在function結束前自動去把物件release掉!
若你使用new,那就要自己去delete。也許你會問: 這麼好的事,那我為何要new? 而 vcl 的說明中又講許多的物件都要new…

原因是: 若你把stack拿來存「所有資料成員」,有時候是不夠放的,stack的大小是有限的,不然可能會stack overflow… 以string來說,其實成員只用約8bytes左右(詳細的大小我有點忘), 所以不會overflow。其他的類別則就不一定那麼小了…

你是否想問真的只有8bytes左右? 你明明就放一堆的字串,超過8bytes? … 你真的放的字串會由string類別自動的放在heap上,它的成員,即data其實放的是一個指標加上reference的大小。而當解構時,類別也會自動的把heap上的字串給幹掉,這你不用擔心。幹掉heap後,data自己的8bytes左右才會被幹掉!
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-04-24 12:04:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!