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

關於StringList記憶體釋放…

答題得分者是:RaynorPao
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-08 14:47:55 IP:61.229.xxx.xxx 未訂閱
各位先進: 因程式需要所以將StringList設為全域變數,不過在BCB5執行測試時,有時會當在那 邊(尤其是開MediaPlayer時),我想請問是程式問題還是單純的系統不穩(win98),謝謝。
#include 
#pragma hdrstop    #include "Unit1.h"
#include "Unit2.h"
#include 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList* MyList=new TStringList();
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
        MyList->LoadFromFile("C:\\DataBase.Vac");               
         //為database為一個文字檔
}    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        delete MyList;
} 
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-08 15:06:34 IP:203.73.xxx.xxx 未訂閱
引言: 各位先進: 因程式需要所以將StringList設為全域變數,不過在BCB5執行測試時,有時會當在那 邊(尤其是開MediaPlayer時),我想請問是程式問題還是單純的系統不穩(win98),謝謝。
#include 
#pragma hdrstop    #include "Unit1.h"
#include "Unit2.h"
#include 
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
TStringList* MyList=new TStringList();
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
        MyList->LoadFromFile("C:\\DataBase.Vac");               
         //為database為一個文字檔
}    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        delete MyList;
} 
moonrise 你好: 建議你把記憶體的配置與釋放寫在 FormCreate/FormDestroy 裡面
TStringList* MyList=NULL;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   MyList=new TStringList;
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   if(MyList!=NULL)
   {
      delete MyList;
   }
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
   MyList->LoadFromFile("C:\\DataBase.Vac");               
   //為database為一個文字檔
}
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-08 15:16:47 IP:61.229.xxx.xxx 未訂閱
RaynorPao,moonrise非常謝謝您…
tomlee
一般會員


發表:5
回覆:14
積分:18
註冊:2003-10-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-11 14:15:06 IP:61.58.xxx.xxx 未訂閱
引言: moonrise 你好: 建議你把記憶體的配置與釋放寫在 FormCreate/FormDestroy 裡面
TStringList* MyList=NULL;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   MyList=new TStringList;
}
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
   if(MyList!=NULL)
   {
      delete MyList;
   }
}
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
   MyList->LoadFromFile("C:\\DataBase.Vac");               
   //為database為一個文字檔
}
-- Enjoy Researching & Developing --
除非有特殊的需要(例如為了編譯效率,不想改到 *.h 檔),否則這裏 的 MyList 最好宣告為類別(TForm1)的成員: class TForm1 : ... { ... private : TStringList *MyList; }; 然後在建構(或 FormCreate)時配好記憶體,解構(FormDestory)時釋 放記憶體。 又,在釋放前 if(MyList!=NULL) { delete MyList; } 判斷是否空指標的動作是絕對多餘的,因為 delete 空指標並不會出錯, 又如果 MyList 指向的是錯誤的記憶體(且非 0 值),那不管有沒有檢查 都會錯,所以,結論是完全不需要做這種檢查。 另,在 C 上空指標直接寫 0 就好了,使用 NULL 巨集的問題比較多, 這是 C 的慣用法,但 C 的型別檢查更嚴格,不需要用 NULL 這種不安全 的方法。 最後,這個問題比較好的方法應是用「聰明指標」,標準函式庫下有一個 auto_ptr 最適合用來解決這類的問題: #include class TForm1 : ... { ... private : std::auto_ptr MyList; }; 然後在 FormCreate 裏寫: MyList.reset(new TStringList); 這樣當 Form 解構時,MyList 就會自動被釋放。 如果 MyList 是全域變數,那也可以這樣: std::auto_ptr MyList(new TStringList); 這樣也不需要擔心 delete 的問題。 但把 MyList 當成 TForm1 成員的好處是可以精確控制它的生命週期及 和其他模組、物件的生成順序。
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-11 22:03:49 IP:61.229.xxx.xxx 未訂閱
tomlee您好: 我是moonrise,謝謝您提供更嚴謹的方法,讓程式更好更穩定。 非常謝謝您…
mkbobo
一般會員


發表:4
回覆:68
積分:19
註冊:2003-04-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-14 14:34:12 IP:202.168.xxx.xxx 未訂閱
引言:最後,這個問題比較好的方法應是用「聰明指標」,標準函式庫下有一個 auto_ptr 最適合用來解決這類的問題: #include class TForm1 : ... { ... private : std::auto_ptr MyList; };
#include  
class TForm1 : ... {
...    private :        std::auto_ptr MyList;
};    
關於tomlee兄 所提出的 程式碼 因為我在測試的時候發現無法使用 應該是 忘了加 [ code] [/ code] 所以少掉了一些程式碼 再這邊做一點補充
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-15 01:40:32 IP:61.229.xxx.xxx 未訂閱
非常謝謝mkbobo兄 不過我把程式碼應用在簡單的範例上,還是有問題耶…  
 
//.h//
#include  
class TForm1 : ... {
...    private :        std::auto_ptr MyList;
};    //.cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{      MyList->Add("Plants");
  MyList->Add("Animals");
  MyList->Add("Minerals");
  MyList->Sorted = true;
  ListBox1->Items->AddStrings(MyList);    }
error: [C Error] Unit1.cpp(25): E2034 Cannot convert 'std::auto_ptr' to 'TStrings *' [C Error] Unit1.cpp(25): E2342 Type mismatch in parameter 'Strings' (wanted 'TStrings *', got 'std::auto_ptr')
mkbobo
一般會員


發表:4
回覆:68
積分:19
註冊:2003-04-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-15 15:38:49 IP:202.168.xxx.xxx 未訂閱
引言: tomlee 寫到 ... 然後在 FormCreate 裏寫: MyList.reset(new TStringList); 這樣當 Form 解構時,MyList 就會自動被釋放。
你是不是忘了做這件事情阿
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-15 16:25:37 IP:61.229.xxx.xxx 未訂閱
啊,我沒加那一行,不過 錯誤不一樣 [C++ Error] Unit1.cpp(24): E2034 Cannot convert 'std::auto_ptr' to 'TStrings *' [C Error] Unit1.cpp(24): E2342 Type mismatch in parameter 'Strings' (wanted 'TStrings *', got 'std::auto_ptr')
mkbobo
一般會員


發表:4
回覆:68
積分:19
註冊:2003-04-10

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-15 21:10:53 IP:202.168.xxx.xxx 未訂閱
引言:非常謝謝mkbobo兄 不過我把程式碼應用在簡單的範例上,還是有問題耶… //.h// #include class TForm1 : ... { ... private : std::auto_ptr MyList; }; //.cpp void __fastcall TForm1::Button1Click(TObject *Sender) { MyList->Add("Plants"); MyList->Add("Animals"); MyList->Add("Minerals"); MyList->Sorted = true; ListBox1->Items->AddStrings(MyList); } error: [C Error] Unit1.cpp(25): E2034 Cannot convert 'std::auto_ptr' to 'TStrings *' [C Error] Unit1.cpp(25): E2342 Type mismatch in parameter 'Strings' (wanted 'TStrings *', got 'std::auto_ptr')
問題出在這行 改成這樣就可以了
ListBox1->Items->AddStrings(&(*MyList));  
moonrise
一般會員


發表:7
回覆:7
積分:2
註冊:2003-10-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-16 12:54:37 IP:61.229.xxx.xxx 未訂閱
謝謝mkbobo兄
系統時間:2024-05-19 15:23:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!