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

ExitThread 會釋放記憶體嗎?

尚未結案
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-31 12:30:48 IP:61.57.xxx.xxx 未訂閱
如果我在一個thread函數中寫
void MyThread()
{
    int *a = new int[3];
    ExitThread(0);
    delete a;
}
不知道a的記憶體會不會被釋放? 又若我寫
void MyThread()
{
    int *b = new int[3];
    throw 1;
    delete b;
}
不知道b的記憶體會不會被釋放? 如果不會,不知道要如何寫才能「安全」的離開這個函數?謝啦!
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-31 17:19:07 IP:211.23.xxx.xxx 未訂閱
引言: 如果我在一個thread函數中寫
void MyThread()
{
    int *a = new int[3];
    ExitThread(0);
    delete a;
}
不知道a的記憶體會不會被釋放?
不會。因為ExitThread就是把thread踢出去啦。 你應把delete a寫在ExitThread之前。
引言:
void MyThread()
{
    int *b = new int[3];
    throw 1;
    delete b;
}
不知道b的記憶體會不會被釋放?
不會! throw 後面的code不會執行。 你應該這樣寫:
void MyThread()
{
    int *b = new int[3];
    try
    {
       throw 1;
    }
    catch(...)
    {
       delete b;
    }
}
引言: 不知道要如何寫才能「安全」的離開這個函數?謝啦!
1.請先搞清楚 --1. thread這個object以及它的運作。(詳見MSDN) --2. try 的作用與使用方式。(詳見MSDN) 2.請參考您之前提問過的問題: 【BCB】【問題】如何終止一個正在執行中的函數? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49946 【BCB】【問題】如何將 thread 終止? http://delphi.ktop.com.tw/topic.php?TOPIC_ID=50242 2篇都有提到如何安全終止thread(終止thread執行, 也就是離開函數)。 3. 請多多利用本站搜尋功能。 ------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Anpinos Middle Earth http://anpino.hp.infoseek.co.jp/ ------------------------------- 發表人 - anpino 於 2004/05/31 17:45:10
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-31 19:32:06 IP:61.63.xxx.xxx 未訂閱
謝謝anpino大大的指導,糾正我以前錯誤的觀念! 目前我的執行函數有點複雜,簡化如下:
bool Stop = false;
void MyThread()
{
    int *a = new int[3];
    
    for (int i=0; i<100000;   i)
    {
        fa(1);
    }        delete a;
}
void fa(int aa)
{
    if (Stop)  ExitThread(1);
    ...    }
void ButtonStopClick()
{
    Stop = true;
}
原則上沒有按下Stop按鈕,Thread會正常執行結束,而a也能被delete掉,但現在問題是若我中途停止它就會執行ExitThread離開thread,但就漏了delete a的動作了,不知道要如何才能解決這個問題...感激!!! PS. MyThread中的for迴圈是用來表示一個長串的程式,表示要執行一段時間,而非真的是迴圈,寫for是用來簡化程式。
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-06-01 08:49:44 IP:211.23.xxx.xxx 未訂閱
1) 將a改成全域變數:  
 
bool Stop = false;
int *a = NULL;
void MyThread()
{
    a = new int[3];
  
    int i = 100000;  
    while (i --)
    {
        fa(1);
    }    }
void fa(int aa)
{
    if (Stop)  
    {
        delete a;
        ExitThread(1);
    }
    ...
}
void ButtonStopClick()
{
    Stop = true;
}    
2)
 
bool Stop = false;
void MyThread()
{
    int *a = new int[3];
    
    int i = 100000;  
    while (i --)
    {
        if (Stop)  
        {
            delete a;
            ExitThread(1);
        }
        fa(1);
    }
}
void fa(int aa)
{
    ...
}
void ButtonStopClick()
{
    Stop = true;
}    
------------------------------- 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D Anpinos Middle Earth http://anpino.hp.infoseek.co.jp/ -------------------------------
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-06-01 11:54:27 IP:61.63.xxx.xxx 未訂閱
謝啦!感激!又學到了不少...
hornacek
一般會員


發表:29
回覆:76
積分:21
註冊:2004-02-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-06-01 18:53:03 IP:210.243.xxx.xxx 未訂閱
引言:
void MyThread()
{
    int *b = new int[3];
    try
    {
       throw 1;
    }
    catch(...)
    {
       delete b;
    }
}
好怪喔?我試了以上的方法結果出現「Project1.exe發生問題,必須關閉,謹此致歉。」後來試著把thread拿掉,就正常了!這是否意謂thread不能用例外的方式處理? 發表人 - hornacek 於 2004/06/01 18:56:30
系統時間:2024-05-02 7:19:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!