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

請問有關如何釋放記憶體

尚未結案
rockhaword
一般會員


發表:3
回覆:5
積分:1
註冊:2011-05-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-06-07 23:16:35 IP:140.114.xxx.xxx 訂閱
最近在寫一個程式需要大量讀取網頁
因為在讀了幾百個網頁後會有記憶體不足的情況
所以必須想辦法釋放記憶體...
查了一下資料 有delete和free兩個方法
delete對應new, free對應malloc
但問題在於我的程式裡沒有用new或是malloc宣告指標變數
但是讀了幾百次網頁後會有記憶體不足的情況
以下是我嘗試去debug測試用的小程式

加入一個WebCppBrowser和兩個Button
首先全域變數為...
IHTMLDocument2 *document;
wchar_t *title, *cookie, *body_buffer, *URLink;

開啟網頁後 (CppWebBrowser1->Navigate(URL))
按下第一個Button Button內容為...
(void *)document = CppWebBrowser1->Document;
for (g=0;g<500; g ){
document->get_title(&title);
g_ws = WideString(title);
g_as = g_ws;
Edit2->Text = g_as;
document->get_cookie(&cookie);
g_as = WideString(cookie);
Edit3->Text = g_as;
document->get_URL(&URLink);
g_as = WideString(URLink);
Edit1->Text = g_as;
document->get_body(&body);
body->get_outerHTML(&body_buffer);
Memo2->Lines->Clear();
Memo2->Text = WideString(body_buffer);
Application->ProcessMessages();
}
////第一個button即讀取五百次的tile, cookie, URLink...等
按下數次第一個button後 會發現越來越多記憶體被吃掉

第二個Button為釋放記憶體 第二個button內容為...
title = 0x0;
cookie = 0x0;
URLink = 0x0;
body = 0x0;
body_buffer=0x0;
delete title;
delete cookie;
delete URLink;
delete body;
delete body_buffer;

/////以上測試失敗 按下後記憶體仍然沒有被釋放

請問如何釋放這幾個wchar_t變數所佔用的記憶體空間?
rick060
高階會員


發表:2
回覆:112
積分:217
註冊:2009-11-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-06-10 16:35:20 IP:60.250.xxx.xxx 未訂閱
 1.get_xxx 出來的不用 free , 且你用法也有問題
//bcb xe 為例
WideString title;
IHTMLDocument2 *pDoc = NULL;
CppWebBrowser1->Document->QueryInterface(IID_IHTMLDocument2,(void**)&pDoc) ;
pDoc->Get_title(title);
2.你想 free 的變數都被你設成 0 了,你要系統 free 到哪去?
a3680p
一般會員


發表:0
回覆:1
積分:0
註冊:2011-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-06-26 11:08:13 IP:203.69.xxx.xxx 訂閱
同學!

我bcb功力很淺,連DLL程式也寫不出來,但常用bcb,我還在用bcb6!

我也發現ㄧ個程式用久,常會有“記憶体”疲乏!

我bcb功力又不够,所以想到ㄧ個方法可解決“記憶体”疲乏的當機!

首先開個目錄,然後用bcb寫兩個相同程式,我將程式定名1.exe和2.exe.

但桌面偼徑用1.exe檔開啓,例如我寫個CppWebBrowser Button程式,

當開啓1.exe檔偼徑程式,1.exe用timer自動執行CppWebBrowser動作,當要執行下個程序時,

按Button執行Close();闗掉1.exe,再自動開啓2.exe檔,當然2.exe結束時㑹自動開啓1.exe檔,

如此交替雖很笨,但可解決“記憶体”疲乏的當機,當然交替檔案時中間放個“缓衝檔案”,那更完美!

看起來很笨但實用!

缓衝檔案主要程序是timer,用以缓衝兩檔交替時使用,例如寫comport檔,當[Close()1.exe]時,先去執行缓衝檔案,再開啓2.exe檔,較不充突,當然缓衝檔案要設定自動Close();

希望對你有幚助,當然我也是delphi.top的受惠著,大家交流ㄧ下,3Q!Bye!



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