作者nowar100 (拋磚引玉)
看板C_and_CPP
標題Re: [問題] 全域物件的解構
時間Sat Feb 12 00:45:07 2011
※ 引述《divinity47 (div)》之銘言:
: 跟姊姊的同學借帳號發問,這問題困擾我好久了 >_<
: 各位大大,請問..
: 我用物件宣告一個陣列,如下(部分程式):
: class apple_event: fruit
: {
: friend int A();
: friend double B();
: friend void C(); // 原本這邊有的五個函式,其中ABC跟問題沒關係
: friend void part_1();
: friend void part_2();
: friend void part_3();
: public:
: void get();
: void push(int);
: void check();
: ~apple_event()
: {delete [] condition;}
: private:
: int condition[2];
: int flag;
: };
: apple_event station[10000];
: 由於手上的只有大一學c++時的簡單用書,書上在class裏頭對於解構的講解少之又少
: 稍微爬了一下文,還是沒有找出疑問,所以想請板上大大幫忙解惑 >"<
: 主要問題有
: 1. 這個函式原本程式可以執行沒有問題
: 可是自從我加入 ~apple_event()
: {delete [] condition;} 這兩行
: 之後只要執行到就會錯,請問該如何寫才正確呢? (不加解構兩行就不會有錯)
: 是因為condition是陣列的關係嗎? 我看書本上寫說陣列解構不用指名陣列元素數目
: 到底問題是出在那呢 =_=
不是動態抓來的空間,不用還回去,他自己會還
只有自己手動抓來的,才需要自己手動還
此例不需自己寫 destructor
: 2. 我的station[]是宣告在全域變數的位子,請問不是應該程式全部執行完才會解構嗎?
: (或是主程式執行完)
是
: 為什麼我連主程式中的while迴圈都還沒跑完,就出現錯誤了呢?
什麼錯誤?
通常是亂搞記憶體,把他搞掛了
: 請問我的station[]陣列到底是何時建構又何時解構呢?
: 書本沒有宣告在全域的位子,所以我讀書的時候一直不是很懂...
main 開始之前建構,main 結束之後解構
這些應該是 Runtime Library 會做掉的
其實也不是真的會建構解構,他不是物件,只是會把 a.out 裡面的東西
在執行 main 之前先搬到記憶體,main 結束以後 Process 結束,整塊記憶體
還給 OS
: 3. 我的程式有大量的運算,所以每次開始run大概兩三分鐘以後,
: 程式速度會慢到讓我在電腦桌前面偷偷打瞌睡....(根本還沒run超過1%...)
不懂這個 1% 是甚麼?CPU utilization?
: 我以為是因為記憶體沒有被釋放掉,一直重複使用、計算的緣故
: 所以想要寫成class,然後用解構去解決這個問題,希望速度可以變快~~(灑花)
imperative 和 OO 的概念不是在於後者比較快
他是一種設計思維的轉變,您可能有點誤會了
例如這個程式
for(...) {
Class object_eg;
}
每跑一次迴圈,未最佳化的情況下,他就要建構一次物件,解構一次物件
並不會因為把東西寫成物件就變快了
: 這樣問有點怪...請問我想的是正確的嗎?
: 或是有什麼其他原因會造成,程式計算速度越拖越慢呢?
: 4. 我的主程式長這樣
:
: int main{
: while (now < end_time) {
: switch (event_ID()) {
: case 0:
: part_1();
: break;
: case 1:
: part_2();
: break;
: case 2:
: part_3();
: break; }}
: 其中part_1、part_2、part_3都是計算的過程,
: 中間也不斷在取用跟存取class裏頭的condition[2]跟flag兩個數值
: 請問我的解構,會不會影響這兩者的計算,我好怕我不小心讓計算錯誤...>_<
要看你物件的 Life Cycle
不過你把物件解構了,再去對他做事情,會掛掉也沒什麼意外的
例如
Class* pObject = new Class;
delete pObject;
pObject->flag = 5566;
: 那我該如何寫才能確實釋放記憶體,讓程式變得更完善呢?
: 請大大幫幫忙了 ( ̄▽ ̄#)﹏﹏
完整的程式碼呢?
您貼上的部份看來不是問題所在
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.36.175.16
→ nowar100:被上篇大大搶先了 XD 02/12 00:45
推 divinity47:1%是指我程式所要跑的資料數目啦... 02/12 00:48
推 legnaleurc:我覺得新手都該先學好 debugger, 可以少很多問題 02/12 00:49
→ divinity47:完整程式碼有一千多行>_< 請問最佳化是什麼 要如何做呢 02/12 00:49
推 legnaleurc:置底有介紹怎麼貼程式碼 02/12 00:52