天天看點

主題:記憶體的管理 DATE:2004-09-17

主題:記憶體的管理

時間:9月17日下午3點

主持:A1.Aleyn.wu

地點:5726882 (會議室)

2004-09-17 15:00:57 A1.Aleyn.wu(45198124)

今天是主題其實是最簡單的,但也是最頭痛的主題,是以,我們單獨拿出來炒一下。

2004-09-17 15:01:20 A1.Aleyn.wu(45198124)

上次的銀行卡事件是前提

2004-09-17 15:02:10 TCP/IP INFO(31329846)

可否簡要說一下 銀行卡事件

2004-09-17 15:02:52 A1.Aleyn.wu(45198124)

我重複一下上一次的東西。

2004-09-17 15:03:02 D3天之痕若虹(86278566)

什麼????銀行卡事件

2004-09-17 15:03:31 A1.Aleyn.wu(45198124)

農村信用卡 GetMem,FreeMem

2004-09-17 15:04:00 A1.Aleyn.wu(45198124)

忘了有幾個卡了,誰還記得。[:~]

2004-09-17 15:06:02 00.天地弦/zhao(185511468)

GetMem和FreeMem是農村信用卡。

New和Dispose是建行借記卡(龍卡)

GlobalAlloc和GlobalFree是工行牡丹卡

VirtualAlloc和VaitualFree是信用卡。 

2004-09-17 15:06:15 開心的武稀松(42088303)

我好像還補充了兩個方法

2004-09-17 15:06:29 00.天地弦/zhao(185511468)

2004-09-13 15:08:46 開心的武稀松(42088303)

還有AllocMem,ReallocMem。 

2004-09-17 15:06:31 A1.Aleyn.wu(45198124)

對,武老二加入兩個。

2004-09-17 15:06:39 00.天地弦/zhao(185511468)

VirtualAlloc和VaitualFree是信用卡。

還有AllocMem,ReallocMem。

2004-09-17 15:06:44 00.天地弦/zhao(185511468)

行了吧

2004-09-17 15:06:53 00.天地弦/zhao(185511468)

2004-09-13 15:09:40 A1.Aleyn.wu(45198124)

我用得最多的是農村信用卡和工行牡丹卡 

2004-09-17 15:07:09 00.天地弦/zhao(185511468)

2004-09-13 15:10:56 A1.Aleyn.wu(45198124)

想搞對象,卡你都有了嗎,沒有的話保證吹了。[:D] 

2004-09-17 15:08:01 A1.Aleyn.wu(45198124)

好,現在正式進入正題。

2004-09-17 15:08:13 A1.Aleyn.wu(45198124)

從第一種卡開始讨論。

2004-09-17 15:08:22 00.天地弦/zhao(185511468)

2004-09-17 15:09:09 A1.Aleyn.wu(45198124)

為什麼說GetMem和FreeMem是農村信用卡呢?

2004-09-17 15:09:47 開心的武稀松(42088303)

其實我覺得這兩個非常實用

2004-09-17 15:10:06 A1.Aleyn.wu(45198124)

大家回憶一下,GetMem和FreeMem是用在哪麼地方的?

農村信用卡的局限性是什麼?

2004-09-17 15:10:53 A1.Aleyn.wu(45198124)

農村信用卡能不能跨市使用?

2004-09-17 15:11:28 00.天地弦/zhao(185511468)

在Delphi是怎麼解釋呢

2004-09-17 15:11:33 A1.Aleyn.wu(45198124)

不知他們改革了沒有,我是記得不可以的。

2004-09-17 15:11:34 TCP/IP INFO(31329846)

不能跨程序 or 線程

2004-09-17 15:12:10 飄塵(43745429)

暈。

2004-09-17 15:12:53 A1.Aleyn.wu(45198124)

如果把程式比較做城市的話,GetMem就是農村信用卡了

2004-09-17 15:13:30 00.天地弦/zhao(185511468)

老吳程式你是說一個Application

2004-09-17 15:13:59 A1.Aleyn.wu(45198124)

2004-09-17 15:14:33 A1.Aleyn.wu(45198124)

請先不要貼圖好不,各位大俠們。

2004-09-17 15:14:39 00.天地弦/zhao(185511468)

不是很了解

2004-09-17 15:14:51 00.天地弦/zhao(185511468)

各位不聽話的同學

2004-09-17 15:15:25 00.天地弦/zhao(185511468)

要注意影響,自己不聽可以睡覺但是不要影響其他同學。老師常說的[;P]

2004-09-17 15:16:05 A1.Aleyn.wu(45198124)

先提問一下。GetMem和FreeMem有幾個朋友熟悉?

2004-09-17 15:16:16 00.天地弦/zhao(185511468)

我很少用

2004-09-17 15:16:21 開心的武稀松(42088303)

這個是最基本的吧

2004-09-17 15:16:31 00.天地弦/zhao(185511468)

為什麼有龍卡不用要用信用卡

2004-09-17 15:17:09 A1.Aleyn.wu(45198124)

這幾個卡各有所用,待會慢慢來讨論。

2004-09-17 15:17:29 TCP/IP INFO(31329846)

作業系統,配置設定的堆不同

2004-09-17 15:18:20 HUI雲中鶴(20695124)

打個比喻來的

2004-09-17 15:18:38 HUI雲中鶴(20695124)

讓你好接受

2004-09-17 15:18:47 開心的武稀松(42088303)

看看

X:\Program Files\Borland\Delphi7\Source\Rtl\Sys\getmem.inc

裡面的函數,整個Delphi和VCL的記憶體配置設定就毫無神秘可言了

2004-09-17 15:19:25 C03.MUSIC(281361369)

開心兄,确實也很牛

2004-09-17 15:20:51 開心的武稀松(42088303)

看看System.PAS中的MemoryManager,整個Delphi的記憶體配置設定和釋放都在這裡管理。當然你也可以接管

2004-09-17 15:21:17 A1.Aleyn.wu(45198124)

GetMem配置設定的記憶體,在本地程式存在時有較,當本地程式釋放時,記憶體也不見了。

2004-09-17 15:21:47 C03.MUSIC(281361369)

那如果在程式退出前我沒有FREEMEM,也會不見了嗎?

2004-09-17 15:22:14 00.天地弦/zhao(185511468)

應該是的

2004-09-17 15:22:26 A1.Aleyn.wu(45198124)

對,你可以試一下,在DLL和EXE中溝通。

2004-09-17 15:22:41 C03.MUSIC(281361369)

噢?怎麼試法?

2004-09-17 15:23:30 開心的武稀松(42088303)

A1兄。但是DLL中配置設定的,DLL我釋放掉,EXE應該還可以通路這片記憶體的阿,怎麼會自動釋放?

2004-09-17 15:23:58 A1.Aleyn.wu(45198124)

在EXE中定義一個指針,在DLL中用GetMem申請記憶體,然後FreeLibrary,不要FreeMem,看看EXE中的指針能不能用。

2004-09-17 15:24:20 開心的武稀松(42088303)

我覺得應該可以的。

2004-09-17 15:24:25   た少林足球(59552649)

當exe調用dll,然後釋放,可是dll好象還是存在,不能真正從記憶體釋放是不是

2004-09-17 15:24:27 C03.MUSIC(281361369)

噢,阿拉明白

2004-09-17 15:25:32 A1.Aleyn.wu(45198124)

要不大家先讨論一下,我花十分鐘寫一個DEMO出來。

2004-09-17 15:25:46 開心的武稀松(42088303)

因為DLL和宿主EXE公用宿主的程序空間,配置設定的記憶體也是在宿主的程序空間内,我覺得不會被自動釋放掉。

2004-09-17 15:25:56 00.天地弦/zhao(185511468)

2004-09-17 15:26:07 C03.MUSIC(281361369)

要不我先問個問題,讓老大先DEMO

2004-09-17 15:26:36 開心的武稀松(42088303)

A1可以用LoadLibrary和

2004-09-17 15:26:53 開心的武稀松(42088303)

FreeLibrary試驗一下

2004-09-17 15:27:11 A1.Aleyn.wu(45198124)

等等,我在寫DEMO。

2004-09-17 15:27:20 00.天地弦/zhao(185511468)

好的

2004-09-17 15:27:29 00.天地弦/zhao(185511468)

我們自由讨論一下吧

2004-09-17 15:28:11 C03.MUSIC(281361369)

我更新資料時出現“另一個使用者修改了資料”,我現在想忽略這個錯誤,讓“另一個使用者”的資料做為正确資料,繼續更新,如何做法,請幫忙

2004-09-17 15:28:38 00.天地弦/zhao(185511468)

看看李維的那本書

2004-09-17 15:28:53 C03.MUSIC(281361369)

我看了,上面沒有具體講 

2004-09-17 15:29:19 Ansili(69786714)

講了的。

2004-09-17 15:29:31 肖宇(236309574)

當我用EXE檔案吊用DLL時,老是出現位址沖突該咋辦?

2004-09-17 15:29:36 D3天之痕若虹(86278566)

<高效資料庫設計>上有說吧

2004-09-17 15:29:51 銀狼(43225570)

我想應該知道是哪條記錄被錯誤傳回了,然後在按照它的主鍵重新下它,再更新,你看如何    C3

2004-09-17 15:30:00 00.bit(10910310)

<高效資料庫設計>是誰寫的

2004-09-17 15:30:07 銀狼(43225570)

李維

2004-09-17 15:30:32 C03.MUSIC(281361369)

是講DBEXPRESS的那本書嗎?

2004-09-17 15:30:44 TCP/IP INFO(31329846)

function _GetMem(Size: Integer): Pointer;

{$IF Defined(DEBUG) and Defined(LINUX)}

var

  Signature: PLongInt;

{$IFEND}

begin

  if Size > 0 then

  begin

    Signature := PLongInt(MemoryManager.GetMem(Size + 4));

    if Signature = nil then

      Error(reOutOfMemory);

    Signature^ := 0;

    Result := Pointer(LongInt(Signature) + 4);

{$ELSE}

    Result := MemoryManager.GetMem(Size);

    if Result = nil then

  end

  else

    Result := nil;

end;

2004-09-17 15:30:55 銀狼(43225570)

我沒看過還

2004-09-17 15:31:15 TCP/IP INFO(31329846)

  MemoryManager: TMemoryManager = (

    GetMem: SysGetMem;

    FreeMem: SysFreeMem;

    ReallocMem: SysReallocMem);

2004-09-17 15:31:18 C03.MUSIC(281361369)

D3

2004-09-17 15:31:31 TCP/IP INFO(31329846)

function SysGetMem(Size: Integer): Pointer;

  Result := __malloc(size);

2004-09-17 15:32:22 00.天地弦/zhao(185511468)

MemoryManager在哪裡我怎麼找不到

2004-09-17 15:32:41 TCP/IP INFO(31329846)

他是一個變量

2004-09-17 15:32:50 TCP/IP INFO(31329846)

全局的

2004-09-17 15:33:07 TCP/IP INFO(31329846)

System單元

2004-09-17 15:33:08 00.天地弦/zhao(185511468)

在system unit裡

  PMemoryManager = ^TMemoryManager;

  TMemoryManager = record

    GetMem: function(Size: Integer): Pointer;

    FreeMem: function(P: Pointer): Integer;

    ReallocMem: function(P: Pointer; Size: Integer): Pointer;

  end;

2004-09-17 15:33:44 TCP/IP INFO(31329846)

{$IFDEF EFENCE}

function __malloc(Size: Integer): Pointer; cdecl;

  external 'libefence.so' name 'malloc';

  external libc name 'malloc';

2004-09-17 15:35:35 A1.Aleyn.wu(45198124)

<a href="http://www.e-midas.cn/test/TestGetMem.rar">http://www.e-midas.cn/test/TestGetMem.rar</a>

2004-09-17 15:35:57 A1.Aleyn.wu(45198124)

大家快下載下傳看一下,然後繼續開課。

2004-09-17 15:36:04 開心的武稀松(42088303)

A1兄說得對,确實是這樣的。我也寫了一個DEMO。證明了你所說的

2004-09-17 15:37:19 A1.Aleyn.wu(45198124)

button1和button2是不同的。

2004-09-17 15:37:23 開心的武稀松(42088303)

有點不明白DLL應該沒有自己的空間,它的GetMem是配置設定在哪裡的,他怎麼知道如何釋放的

2004-09-17 15:37:43 A1.Aleyn.wu(45198124)

對,武兄說的也就是我們要讨論的東西之一。

2004-09-17 15:38:02 A1.Aleyn.wu(45198124)

是以說,最基本的東西卻是我們最頭痛的東西。

2004-09-17 15:38:21 開心的武稀松(42088303)

我知道了

2004-09-17 15:38:39 開心的武稀松(42088303)

A1兄說的也不盡對。我又做了一個試驗

2004-09-17 15:38:43 A1.Aleyn.wu(45198124)

也就是說它是農村信用卡的原因。

2004-09-17 15:39:30 A1.Aleyn.wu(45198124)

在我的DEMO裡有兩個試驗,一個可以,一個不可以,原因大家可以讨論一下。

2004-09-17 15:39:53 開心的武稀松(42088303)

因為Delphi所制的DLL裡面有自己的System單元的MemoryManager記憶體管理器。DLL釋放的時候記憶體管理器會清理記憶體

2004-09-17 15:40:31 A1.Aleyn.wu(45198124)

button1,先FreeLibrary,再使用pp,就出現問題了。

2004-09-17 15:40:54 A1.Aleyn.wu(45198124)

button2,先用pp,再FreeLibrary,所有問題沒有出現。

2004-09-17 15:41:13 開心的武稀松(42088303)

但是如果宿主EXE是帶VCL包運作,而DLL也是帶VCL包運作。這樣他們共享一個記憶體管理器,這樣的DLL釋放掉就不會清理記憶體,因為MemoryManager是和EXE公用的。

2004-09-17 15:41:36 開心的武稀松(42088303)

是以A1

2004-09-17 15:41:46 A1.Aleyn.wu(45198124)

武兄把問題給細化了。[:D]

2004-09-17 15:41:50 開心的武稀松(42088303)

是以A1說得使雙方都不帶包的情況下

2004-09-17 15:42:14 00.天地弦/zhao(185511468)

武老大,你的DLL一般帶包不

2004-09-17 15:42:42 開心的武稀松(42088303)

如果帶包就會小很多,而且可以用String等很友善。我有時候會帶包運作

2004-09-17 15:43:41 A1.Aleyn.wu(45198124)

假如,都帶包的話,就不需要讨論這個GetMem和其它卡的問題了,因為,使用了同一個記憶體管理器。

2004-09-17 15:43:53 D3天之痕若虹(86278566)

to: A1

  在DLL 要uses sharemem吧

2004-09-17 15:43:57 HUI雲中鶴(20695124)

A1 你是指DLL給單個EXE調用時的情況吧

2004-09-17 15:44:03 00.天地弦/zhao(185511468)

A1繼續

2004-09-17 15:44:33 A1.Aleyn.wu(45198124)

是以,今天的課是指一般情況下,也就是生成可執行的檔案(不帶包運作的)

2004-09-17 15:44:55 A1.Aleyn.wu(45198124)

to D3,不需要。

2004-09-17 15:45:02 A1.Aleyn.wu(45198124)

to Hui,不隻。

2004-09-17 15:45:32 開心的武稀松(42088303)

如果帶包的話很友善,不用ShareMem就可以直接使用String做傳回值和參數

2004-09-17 15:45:51 C03.MUSIC(281361369)

帶包是指把BPL與可執行檔案一起嗎?

2004-09-17 15:46:08 A1.Aleyn.wu(45198124)

對。

2004-09-17 15:46:11 開心的武稀松(42088303)

先不讨論這個了,算是特例。A1繼續吧

2004-09-17 15:47:24 A1.Aleyn.wu(45198124)

按照這個DEMO,我們可以想象,GETMEM是根居在哪申請就在哪存在。

2004-09-17 15:47:29 A1.Aleyn.wu(45198124)

對否?

2004-09-17 15:48:00 00.天地弦/zhao(185511468)

在DLL申請,就在DLL存在,DLL不存在了,也完了

2004-09-17 15:48:06 開心的武稀松(42088303)

在哪裡申請就由哪裡的記憶體管理器管理更确切一點

2004-09-17 15:48:55 A1.Aleyn.wu(45198124)

對,農村信用卡也差不多也,君不見之前的信合社風波。。。

2004-09-17 15:49:49 00.天地弦/zhao(185511468)

呵呵

2004-09-17 15:49:55 HUI雲中鶴(20695124)

在哪裡申請的卡就隻能在哪裡用吧?

2004-09-17 15:50:03 00.天地弦/zhao(185511468)

New和Dispose是建行借記卡(龍卡) 講這個了吧

2004-09-17 15:50:15 00.天地弦/zhao(185511468)

在DLL申請,就在DLL存在,DLL不存在了,也完了 

2004-09-17 15:50:23 A1.Aleyn.wu(45198124)

2004-09-17 15:50:44 00.天地弦/zhao(185511468)

在DLL申請,DLL存在時就存在,DLL不存在了也就不存在了,是吧

2004-09-17 15:50:58 A1.Aleyn.wu(45198124)

等等,我做第二個。

2004-09-17 15:51:43 HUI雲中鶴(20695124)

DLL不存在了也就不存在了----是DLL不存在了,就自動釋放了嗎

2004-09-17 15:51:46 歡樂狗熊(228175978)

不見的吧

2004-09-17 15:52:00 開心的武稀松(42088303)

MemoryManager管理器不在了就釋放了

2004-09-17 15:52:08 00.天地弦/zhao(185511468)

to UI雲中鶴嗯,我的了解是這個的

2004-09-17 15:52:21 HUI雲中鶴(20695124)

我也是

2004-09-17 15:52:26 00.天地弦/zhao(185511468)

DLL和Exe是兩個不同的MemoryManager是吧

2004-09-17 15:52:39 00.天地弦/zhao(185511468)

武老大

2004-09-17 15:52:39 飄塵(43745429)

記憶體總不是一個檔案管理器差不多的

2004-09-17 15:52:42 歡樂狗熊(228175978)

不是公用的嗎,不見的全部放吧

2004-09-17 15:53:04 開心的武稀松(42088303)

不共享運作包的情況下是兩個管理器

2004-09-17 15:53:10 00.天地弦/zhao(185511468)

2004-09-17 15:54:21 TCP/IP INFO(31329846)

關于,包的加載問題,能不能說一下呀

2004-09-17 15:54:30 C03.MUSIC(281361369)

改成A2就可以了

2004-09-17 15:54:31 開心的武稀松(42088303)

在等A1兄的高見。讨論了一番卻是糾正了一些了解

2004-09-17 15:54:45 00.天地弦/zhao(185511468)

是的

2004-09-17 15:55:12 TCP/IP INFO(31329846)

包的加載,和 dll 的加載是不是相同

2004-09-17 15:55:23 開心的武稀松(42088303)

包也是DLL

2004-09-17 15:55:32 歡樂狗熊(228175978)

應該差不多吧

2004-09-17 15:55:37 開心的武稀松(42088303)

隻不過是由約定好的了的DLL

2004-09-17 15:58:10 TCP/IP INFO(31329846)

這句不解

2004-09-17 15:58:52 00.天地弦/zhao(185511468)

帶包就共享記憶體的

2004-09-17 16:00:42 A1.Aleyn.wu(45198124)

2004-09-17 16:01:24 開心的武稀松(42088303)

天地會你入不

2004-09-17 16:01:29 A1.Aleyn.wu(45198124)

= = Demo ing

2004-09-17 16:01:39 蒙雨(19171290)

老大,我可不可以入會呀 

2004-09-17 16:01:43 TCP/IP INFO(31329846)

還是不解

2004-09-17 16:02:03 00.天地弦/zhao(185511468)

我當然要入了

我排了很久了

你一進去就是董事會

我從職員做起

2004-09-17 16:02:15 開心的武稀松(42088303)

确切的說DLL和EXE本來就是共享記憶體的。帶包是共享記憶體管理器

2004-09-17 16:04:17 00.天地弦/zhao(185511468)

差點誤人子弟了,幸好武老大糾正

2004-09-17 16:04:22 00.天地弦/zhao(185511468)

42088303(開心的武稀松) 16:02:15

确切的說DLL和EXE本來就是共享記憶體的。帶包是共享記憶體管理器 

2004-09-17 16:06:05 D3天之痕若虹(86278566)

[:D]言規正傳。。。

2004-09-17 16:06:14 00.天地弦/zhao(185511468)

A1還在Demo ing

2004-09-17 16:08:29 A1.Aleyn.wu(45198124)

大家把剛才的檔案重新下載下傳一下,這次加了New()

2004-09-17 16:11:38 A1.Aleyn.wu(45198124)

大家試一下,New和GetMem是差不多的。

2004-09-17 16:12:11 A1.Aleyn.wu(45198124)

隻不過是New比GetMem“先進”了一些。(好象是這樣吧)

2004-09-17 16:12:48 D1.jackey(409485288)

在忙。晚上看qq記錄.

2004-09-17 16:13:18 00.天地弦/zhao(185511468)

還沒有搞定

2004-09-17 16:13:50 開心的武稀松(42088303)

應該是GetMem比New先進。New隻能配置設定有類型的指針,隻能配置設定一個長度

2004-09-17 16:14:11 00.天地弦/zhao(185511468)

new是龍卡哦

2004-09-17 16:14:49 開心的武稀松(42088303)

卡是先進,但不靈活

2004-09-17 16:15:00 B1.斜陽(249208513)

我不清楚大家注意到沒有,釋放記憶體的函數,可以不指定要釋放的指針到底指向了多大的記憶體,但是一樣可以正确釋放?Why?

2004-09-17 16:15:00 A1.Aleyn.wu(45198124)

在有類型的指針的情況下,new比GetMem友善

2004-09-17 16:15:26 開心的武稀松(42088303)

New隻能配置設定一個長度,GetMem可以配置設定一大片

2004-09-17 16:15:38 A1.Aleyn.wu(45198124)

對,是以說各有所長。

2004-09-17 16:15:58 A1.Aleyn.wu(45198124)

要不它就不會搞二個出來,一個就夠了。[:D]

2004-09-17 16:16:08 開心的武稀松(42088303)

一個友善,一個靈活

2004-09-17 16:16:19 B1.斜陽(249208513)

隻要不是使用Windows自帶的API直接申請記憶體,所有的記憶體管理最終好像都歸結到那個記憶體管理器上的那個配置設定記憶體的過程上了

2004-09-17 16:16:37 A1.Aleyn.wu(45198124)

呵呵,所見略同也。

2004-09-17 16:16:55 A1.Aleyn.wu(45198124)

這也許也是Delphi故意的。

2004-09-17 16:17:12 開心的武稀松(42088303)

C也是一樣的

2004-09-17 16:17:36 B1.斜陽(249208513)

其實這也許是Pascal語言遺留下來的相容問題吧

2004-09-17 16:17:50 大羽(393921295)

GetMem是動态的block,如果頻繁的插入等操作

維護這個block會影響性能把,

2004-09-17 16:18:43 B1.斜陽(249208513)

我覺得,如果你讓Delphi去管理你的底層記憶體,那你就放心使用New或者GetMem就是了,否則,就直接使用API

2004-09-17 16:18:48 開心的武稀松(42088303)

大羽是說連結清單麼?那你說呢

2004-09-17 16:18:51 A1.Aleyn.wu(45198124)

好,我們繼續第三個,00幫我找出第三個卡的比喻,我DEMO ing

2004-09-17 16:19:11 B1.斜陽(249208513)

啥啊,迷糊了!

2004-09-17 16:19:19 大羽(393921295)

如果數組,如果知道長度比你不知道用疊代效率要高不少

2004-09-17 16:19:31 大羽(393921295)

例如數組

2004-09-17 16:19:49 開心的武稀松(42088303)

對是以現在動态數組的出現大有取代指針作連結清單的趨勢

2004-09-17 16:20:30 B1.斜陽(249208513)

對動态數組大小的重新配置設定是個很頭痛的問題

2004-09-17 16:20:46 B1.斜陽(249208513)

并且,數組在進行插入操作的時候很耗時

2004-09-17 16:21:03 大羽(393921295)

getmem适合比較簡單,重複少的操作

2004-09-17 16:21:06 開心的武稀松(42088303)

動态數組隻是浪費記憶體,但是時間效率上臂指針作連結清單要快許多

2004-09-17 16:21:14 B1.斜陽(249208513)

連結清單和數組是各取所需,各有長短

2004-09-17 16:21:30 大羽(393921295)

也是農村卡的另一層涵義

2004-09-17 16:21:45 開心的武稀松(42088303)

動态數組,指針連結清單。一個時間效率高,一個空間效率高

2004-09-17 16:21:54 飄塵(43745429)

最主要是記憶體分塊大小了,

2004-09-17 16:21:58 B1.斜陽(249208513)

那要看什麼效率,如果說是在随機插入上,連結清單要比數組效率高許多

2004-09-17 16:22:00 飄塵(43745429)

作業系統上有了

2004-09-17 16:22:06 大羽(393921295)

總要付出代價

2004-09-17 16:22:24 大羽(393921295)

這要看需要了

2004-09-17 16:22:32 飄塵(43745429)

要是分塊太大的話,或者太小

2004-09-17 16:22:38 開心的武稀松(42088303)

但是如果通路第幾個元素的時候連結清單就慢得多

2004-09-17 16:23:47 開心的武稀松(42088303)

因為連結清單要一個一個走,直到走到你要的元素。而動态數組一條Mov指令就搞定了

2004-09-17 16:23:55 大羽(393921295)

記憶體配置設定比如堆棧 ,heap各有各的适用範圍

2004-09-17 16:24:04 開心的武稀松(42088303)

說錯了是Inc指令

2004-09-17 16:25:01 A1.Aleyn.wu(45198124)

請大家重新下載下傳。

這次加入GlobalAlloc

2004-09-17 16:27:02 A1.Aleyn.wu(45198124)

這次看看,是不是兩個都可以,不管有沒有FreeLibrary都可以。

走到哪都通用。

2004-09-17 16:29:04 00.天地弦/zhao(185511468)

A1是不是FreeLibrary後要手工調用GlobalFree

是嗎?

2004-09-17 16:29:17 A1.Aleyn.wu(45198124)

2004-09-17 16:29:39 00.天地弦/zhao(185511468)

好,這個就像你做那個TSafeXXXObject一樣

2004-09-17 16:29:48 00.天地弦/zhao(185511468)

是不

2004-09-17 16:29:57 A1.Aleyn.wu(45198124)

跟那個沒什麼關系吧?

2004-09-17 16:30:16 00.天地弦/zhao(185511468)

那個也要手工Free是吧

2004-09-17 16:30:30 A1.Aleyn.wu(45198124)

那個是對象。

2004-09-17 16:30:44 00.天地弦/zhao(185511468)

嗯,等下我再去補習

2004-09-17 16:32:30 B1.斜陽(249208513)

要說明什麼問題呢

2004-09-17 16:32:44 A1.Aleyn.wu(45198124)

對了,忘了做小結了。[:D]

2004-09-17 16:32:46 00.天地弦/zhao(185511468)

今天要講記憶體管理的那四張卡給大家聽

2004-09-17 16:33:33 C03.MUSIC(281361369)

講一下适用範圍吧,農村卡知道了,其他沒有講吧

2004-09-17 16:35:09 A1.Aleyn.wu(45198124)

(1),GetMem和New是針對同一個Application來用的,因為,它們是使用同一個記憶體管理器,在不同的Application(不同的記憶體管理器),記憶體管理無效。除非記憶體管理器存在。

(2)。GlobalAlloc是API函數,和Delphi的記憶體管理器無關,是以,在不同的Application,可以有效。

2004-09-17 16:36:53 B1.斜陽(249208513)

對兩個Application本身也不能互相通路對方配置設定的指針指向的記憶體啊

2004-09-17 16:37:20 A1.Aleyn.wu(45198124)

還有另外一個VirtualAlloc和VirtualFree,因為我用得少,是以隻能請另一位大俠來講解了。

2004-09-17 16:38:07 A1.Aleyn.wu(45198124)

兩個application在這裡是指(EXE和DLL)[:D]

2004-09-17 16:38:09 B1.斜陽(249208513)

不對,GlobalAlloc是在自己的程序位址空間中配置設定記憶體,對于别的程序是無效的啊

2004-09-17 16:38:44 B1.斜陽(249208513)

噢,早說啊,吓我一跳

2004-09-17 16:40:48 A1.Aleyn.wu(45198124)

現在,大家都應該知道這幾張卡的大概用途了吧?

2004-09-17 16:41:09 HUI雲中鶴(20695124)

VirtualAlloc和VirtualFree 這兩個還沒講呢

2004-09-17 16:41:17 00.天地弦/zhao(185511468)

有點模糊

2004-09-17 16:41:37 HUI雲中鶴(20695124)

現在有點概念了

2004-09-17 16:42:04 A1.Aleyn.wu(45198124)

如果是在同一個EXE裡,那麼,用哪一個都無所謂。不過GetMem倒是快了一點。

2004-09-17 16:42:20 00.天地弦/zhao(185511468)

我一般用new

2004-09-17 16:42:31 TCP/IP INFO(31329846)

GlobalAlloc 可不可以在不同程序間 共享呀

2004-09-17 16:42:36 李逸(57440981)

Delphi中有new嗎

2004-09-17 16:42:44 00.天地弦/zhao(185511468)

2004-09-17 16:43:15 A1.Aleyn.wu(45198124)

如果在EXE和DLL中傳,那麼優先用GlobalAlloc

2004-09-17 16:43:27 00.天地弦/zhao(185511468)

2004-09-17 16:43:31 00.天地弦/zhao(185511468)

31329846(TCP/IP INFO) 16:42:31

GlobalAlloc 可不可以在不同程序間 共享呀 

2004-09-17 16:43:40 B1.斜陽(249208513)

不可以

2004-09-17 16:43:44 A1.Aleyn.wu(45198124)

沒試用,不清楚。

2004-09-17 16:44:13 00.天地弦/zhao(185511468)

還有兩個呢

AllocMem,ReallocMem。 

2004-09-17 16:44:32 A1.Aleyn.wu(45198124)

幾個都好象不可以。

2004-09-17 16:44:43 00.天地弦/zhao(185511468)

武老大說說

2004-09-17 16:44:47 A1.Aleyn.wu(45198124)

AllocMem,ReallocMem請武兄來講講。

2004-09-17 16:44:56 B1.斜陽(249208513)

不同的程序之間共享記憶體需要的是其它的機制

2004-09-17 16:45:17 00.天地弦/zhao(185511468)

深度曆險裡有

2004-09-17 16:45:19 開心的武稀松(42088303)

function AllocMem(Size: Cardinal): Pointer;

  GetMem(Result, Size);

  FillChar(Result^, Size, 0);

2004-09-17 16:45:34 開心的武稀松(42088303)

還用講麼,隻不過是他把記憶體初始化為0

2004-09-17 16:46:10 李逸(57440981)

GlobalAlloc可以在不同的程序中間通路

2004-09-17 16:46:25 A1.Aleyn.wu(45198124)

等於開了戶再幫你存錢而已。[:D]

2004-09-17 16:46:36 00.天地弦/zhao(185511468)

哦還有老吳剛剛GlobalAlloc裡沒有Free

要怎麼Free

2004-09-17 16:46:39 李逸(57440981)

Global是全局的意思

2004-09-17 16:46:40 A1.Aleyn.wu(45198124)

請老狼講課[share]

2004-09-17 16:46:53 李逸(57440981)

嗯??我隻是談談自己的看法

2004-09-17 16:47:07 A1.Aleyn.wu(45198124)

你的看法就是我們的進步。

2004-09-17 16:47:08 TCP/IP INFO(31329846)

GlobalFree

2004-09-17 16:47:19 00.天地弦/zhao(185511468)

GlobalFree怎麼用

2004-09-17 16:47:24 李逸(57440981)

嗨,這就成了瞎扯了

2004-09-17 16:47:40 A1.Aleyn.wu(45198124)

大家先說發話,先聽A2講課。

2004-09-17 16:48:07 00.天地弦/zhao(185511468)

應該是不行的,要不陳寬達也就不用那個幸苦了

2004-09-17 16:48:12 李逸(57440981)

我隻是隻道GlobalAlloc配置設定後的記憶體塊是一個句柄,這個句柄呢在Windows中可是唯一的,這樣的話,肯定可以和其它程序共享的

2004-09-17 16:48:27 A1.Aleyn.wu(45198124)

對,是句柄

2004-09-17 16:48:56 李逸(57440981)

鎖定句柄就可以得到這塊記憶體在自己程序中的指針位址

2004-09-17 16:49:16 TCP/IP INFO(31329846)

GlobalLock

2004-09-17 16:49:27 李逸(57440981)

不同的程序GlobalLock後得到不同的位址

2004-09-17 16:51:16 A1.Aleyn.wu(45198124)

這個可以試一試了。

2004-09-17 16:51:39 A1.Aleyn.wu(45198124)

我倒是沒有想到這一點。[:D]

2004-09-17 16:51:54 00.天地弦/zhao(185511468)

老大你試試。

2004-09-17 16:52:12 00.天地弦/zhao(185511468)

試好了,共享一下,[:D]

2004-09-17 16:52:18 TCP/IP INFO(31329846)

GlobalAlloc

GlobalDiscard

GlobalFlags

GlobalHandle

GlobalMemoryStatus

GlobalReAlloc

GlobalSize

GlobalUnlock

Global 的東西很多呀

2004-09-17 16:53:02 00.天地弦/zhao(185511468)

to TCP/IP INFO

GlobalFree在Exe怎麼釋放pp

2004-09-17 16:53:52 00.天地弦/zhao(185511468)

  pp: pchar;

  Lib: THandle;

  TestGlobalAlloc: TTestGlobalAlloc;

  Lib := LoadLibrary('TestDLL.dll');

  TestGlobalAlloc := GetProcAddress(Lib, 'TestGlobalAlloc');

  pp := TestGlobalAlloc;

  FreeLibrary(Lib);

  Edit1.Text := pp;

2004-09-17 16:54:50 TCP/IP INFO(31329846)

HGLOBAL GlobalFree(

    HGLOBAL hMem  // handle to the global memory object

   );

GlobalFree 要的是 HGLOBAL 類型

2004-09-17 16:55:20 00.天地弦/zhao(185511468)

那在Exe裡怎麼釋放

2004-09-17 16:56:01 TCP/IP INFO(31329846)

HGLOBAL,沒從 dll 中傳出來呀,可能得轉一下

2004-09-17 16:56:25 00.天地弦/zhao(185511468)

2004-09-17 16:56:58 00.天地弦/zhao(185511468)

HGLOBAL在DLL裡哪個可以得到

2004-09-17 16:57:14 00.天地弦/zhao(185511468)

GlobalAlloc(GHND, 1024)這個傳回一個HGLOBAL

2004-09-17 16:57:19 00.天地弦/zhao(185511468)

2004-09-17 16:57:22 TCP/IP INFO(31329846)

2004-09-17 16:57:25 A1.Aleyn.wu(45198124)

老狼,我試了幾次,都不可以,為什麼呢?

2004-09-17 16:57:34 TCP/IP INFO(31329846)

看看 Win32 API 呀

2004-09-17 16:58:03 李逸(57440981)

你要是能夠得到正确的Handle就可以互相共享

2004-09-17 16:58:06 00.天地弦/zhao(185511468)

嗯,我很少看

2004-09-17 16:58:40 A1.Aleyn.wu(45198124)

Handle是正确的。

2004-09-17 16:58:46 TCP/IP INFO(31329846)

共享是不是得 要 HGLOBAL 值呀,不要 GlobalLock

2004-09-17 16:59:09 A1.Aleyn.wu(45198124)

第一個:

  TT:=GlobalAlloc(GHND,100);

  PP:=GlobalLock(TT);

  PP:='TestGlobalAlloc';

  edit1.Text:=pp;

  edit2.Text:=inttostr(Cardinal(TT));

  GlobalUnLock(TT);

2004-09-17 16:59:12 李逸(57440981)

我在書中那個Drowing的例子,剪切闆就是使用Handle傳遞的

2004-09-17 16:59:19 A1.Aleyn.wu(45198124)

第二個:

  TT:=Cardinal(strtoint(edit2.Text));

2004-09-17 17:01:40 00.天地弦/zhao(185511468)

陳寬達說C++裡不同程序間共享記憶體很簡單。在Delphi裡實作就麻煩了

2004-09-17 17:02:45 B1.斜陽(249208513)

剛剛看了一下GlobalAlloc的幫助,說這個函數是從Windows堆中配置設定所需要的記憶體

2004-09-17 17:02:57 A1.Aleyn.wu(45198124)

2004-09-17 17:03:12 00.天地弦/zhao(185511468)

暈我的Help裡沒有GlobalAlloc這個

2004-09-17 17:04:28 B1.斜陽(249208513)

如果用預設參數調用GlobalAlloc函數,需要使用

GlobalLock來獲得在本程序中對應的記憶體指針

2004-09-17 17:04:36 A1.Aleyn.wu(45198124)

看來得找個時間好好試驗一下。看一下能不能突破限制。

2004-09-17 17:04:43 A1.Aleyn.wu(45198124)

2004-09-17 17:05:07 嘉嘉!(13820956)

185511468(00.天地弦[find]) 17:03:12

你到MSDN裡查!那是WIN API!

2004-09-17 17:05:12 B1.斜陽(249208513)

使用完成後,要先用GlobalUnlock然後再釋放

2004-09-17 17:05:21 A1.Aleyn.wu(45198124)

2004-09-17 17:06:08 A1.Aleyn.wu(45198124)

Delphi幫助裡有一個Windows SDK的幫助就是了。

2004-09-17 17:06:16 李逸(57440981)

對啊

2004-09-17 17:07:11 TCP/IP INFO(31329846)

在 Delphi 中,寫 GlobalAlloc ,按F1就有了

2004-09-17 17:07:17 B1.斜陽(249208513)

對GlobalLock函數的幫助上說是對指定的那個句柄的鎖定技術值加1

2004-09-17 17:08:57 A1.Aleyn.wu(45198124)

暈,不同程序,GlobalSize查出來的東西是0

2004-09-17 17:09:12 李逸(57440981)

呵呵,厲害

2004-09-17 17:09:20 A1.Aleyn.wu(45198124)

也就是說,不同程序,GlobalAlloc可能無效。

2004-09-17 17:09:57 B1.斜陽(249208513)

從這幾個函數的幫助上看,在使用GlobalAlloc配置設定記憶體時,通過第一個參數,可以配置設定一個多個例程都可以通路到的記憶體

2004-09-17 17:10:08 00.天地弦/zhao(185511468)

老大你怎麼試的

2004-09-17 17:12:50 開心的武稀松(42088303)

可以把我們的讨論整理一下,以技術讨論的形式出版一本書

2004-09-17 17:13:19 A1.Aleyn.wu(45198124)

00做好今天的筆記,明天出版。

2004-09-17 17:13:20 00.天地弦/zhao(185511468)

我還想請大家出書呢

2004-09-17 17:13:28 00.天地弦/zhao(185511468)

OK

2004-09-17 17:14:04 李逸(57440981)

不會的吧,比如一個Handle通過GlobalAlloc配置設定的,比方是0x00001200,你甚至可以在另一個程式中輸入這個數值作為handle的值,然後GlobalLock之,結果是一樣的

2004-09-17 17:15:11 開心的武稀松(42088303)

我們出版電子書

2004-09-17 17:15:34 00.天地弦/zhao(185511468)

呵呵,那個可以賺錢嗎?

2004-09-17 17:16:00 A1.Aleyn.wu(45198124)

to A2,我正是這樣試的。

2004-09-17 17:16:03 開心的武稀松(42088303)

幹嗎賺錢?要是想賺錢A1老大能免費給大家講麼

2004-09-17 17:16:24 開心的武稀松(42088303)

大家向A1學習

2004-09-17 17:16:38 00.天地弦/zhao(185511468)

呵呵,是的,不過那種還要好一點哦

2004-09-17 17:18:21 A1.Aleyn.wu(45198124)

事件有進展了,但資料還是錯的。

2004-09-17 17:18:38 李逸(57440981)

什麼進展呢

2004-09-17 17:18:56 李逸(57440981)

你先用一個String之類的明文資料試試看啊

2004-09-17 17:19:16 A1.Aleyn.wu(45198124)

對啊,我是用你的方法來試的。

2004-09-17 17:19:28 李逸(57440981)

反正我的Drowing剪切闆就是通過剪切闆傳遞一個Handle的

2004-09-17 17:19:50 李逸(57440981)

書上是有代碼的,我也不需要試驗的

2004-09-17 17:19:57 A1.Aleyn.wu(45198124)

和GlobalAlloc第一個參數有關,正在試中。

2004-09-17 17:20:34 TCP/IP INFO(31329846)

随着程序的分離記憶體空間的出現,程序不能簡單地使用GlobalAlloc()函數來配置設定記憶體,并把它轉遞給另一個程序來共享,一個程序檢查有另一個程序配置設定的指針,他隻是指向随機位址。然而,在32位的Windows系統支援在程序間共享記憶體映象檔案,可以通過記憶體映象檔案來達到記憶體共享的目的。

2004-09-17 17:20:49 李逸(57440981)

第一個參數是什麼呢SHARE類型的?

2004-09-17 17:21:00 A1.Aleyn.wu(45198124)

都試過。 

2004-09-17 17:21:18 A1.Aleyn.wu(45198124)

GHND,GPRT,GMEM_SHARE都試了。

2004-09-17 17:21:27 李逸(57440981)

哦,要不要我将代碼給你試試看呢

2004-09-17 17:21:31 TCP/IP INFO(31329846)

GlobalAlloc() 是不行得

2004-09-17 17:21:59 A1.Aleyn.wu(45198124)

對,TCP/IP INFO說的我好象之前有看過。

2004-09-17 17:22:38 A1.Aleyn.wu(45198124)

A2,代碼長不長?

2004-09-17 17:22:52 李逸(57440981)

那個程式當然不長

2004-09-17 17:22:57 李逸(57440981)

例子麻

2004-09-17 17:23:11 A1.Aleyn.wu(45198124)

[:D]發來看看。

2004-09-17 17:23:12 TCP/IP INFO(31329846)

<a href="http://www.joinwingroup.com/myclub/cgi-bin/topic.cgi?forum=1&amp;topic=20&amp;replynum=last#bottom">http://www.joinwingroup.com/myclub/cgi-bin/topic.cgi?forum=1&amp;topic=20&amp;replynum=last#bottom</a>

這裡有

2004-09-17 17:23:14 00.天地弦/zhao(185511468)

老大我要早退了,下班了

2004-09-17 17:24:11 B1.斜陽(249208513)

我正在測試

2004-09-17 17:24:47 開心的武稀松(42088303)

A1為何不發動大家我們做一個開源的項目呢。

2004-09-17 17:25:18 D3天之痕若虹(86278566)

呵呵,時機還沒到呢

2004-09-17 17:25:46 A1.Aleyn.wu(45198124)

我已經發動了,隻是力量不夠,時間也有限。。。[:~]

2004-09-17 17:26:03 A1.Aleyn.wu(45198124)

EDS隊建立正是這個目的。

2004-09-17 17:26:16 開心的武稀松(42088303)

對啊,我也感覺時間有限

2004-09-17 17:27:14 開心的武稀松(42088303)

中國程式員要為戶口而忙活,是以這種開源的項目成功得不多。因為大家都時間去搞

2004-09-17 17:28:28 李逸(57440981)

Handle = GlobalAlloc(GMEM_SHARE|GMEM_MOVEABLE,  //重新配置設定全局記憶體

         sizeof(TDataToSave) * Src-&gt;Selection-&gt;Count +

         sizeof(TFileHeader));              //按照圖形數量和标記頭

DataPoint = (char*)GlobalLock(Handle);      //所需要的大小配置設定

Header = (TFileHeader*)DataPoint;           //鎖定記憶體并轉化為标記頭

Header-&gt;DrawCount = Src-&gt;Selection-&gt;Count;  //用于記錄拷貝圖形的數量

//.....資料儲存

GlobalUnlock(DataPoint)

2004-09-17 17:28:31 李逸(57440981)

SetAsHandle(Form2-&gt;ClipBoardFormat,(int)Handle);

2004-09-17 17:28:58 李逸(57440981)

這是将資料複制到配置設定的記憶體塊中,然後交給剪切闆

2004-09-17 17:29:53 李逸(57440981)

    Handle = (void*)GetAsHandle(Form2-&gt;ClipBoardFormat);

    if( !Handle )                               //資料格式的句柄

    {                                           //為空表示沒有相應格式的

       Close();                                 //資料,關閉剪貼闆并傳回

       return;

    }

    DataPoint = (char*)GlobalLock(Handle);      //鎖定記憶體為指針

    if(!DataPoint)                              //若鎖定後指針無效

2004-09-17 17:30:05 李逸(57440981)

    {                                           //說明拷貝的資料塊

       GlobalUnlock(DataPoint);                 //無效,釋放指針、

       Close();                                 //關閉剪貼闆并傳回

    Header = (TFileHeader*)DataPoint;           //讀取标記頭

    if(Header-&gt;DrawCount == 0)                  //若複制的圖形數量

    {                                           //為0,表示資料無效

       GlobalUnlock

2004-09-17 17:30:40 李逸(57440981)

這是其它程序或者本程序根據剪切闆的内容讀取資料的代碼

2004-09-17 17:30:43 李逸(57440981)

部分代碼

2004-09-17 17:31:28 A1.Aleyn.wu(45198124)

可能C和D的管理方式不同,加了GMEM_MOVEABLE就更不行了。

2004-09-17 17:31:37 李逸(57440981)

不可能吧

2004-09-17 17:31:48 李逸(57440981)

這個是API的函數,不是Delphi 的吧

2004-09-17 17:31:51 A1.Aleyn.wu(45198124)

剛剛試了。[:D]

2004-09-17 17:32:07 李逸(57440981)

我要先走了,不管了,房子正在裝修呢

2004-09-17 17:32:27 A1.Aleyn.wu(45198124)

慢走,[bye]

2004-09-17 17:37:12 B1.斜陽(249208513)

呵呵,失敗告終!

2004-09-17 17:38:38 A1.Aleyn.wu(45198124)

B1你又是怎麼試的?

2004-09-17 17:39:32 B1.斜陽(249208513)

在一個程序中配置設定一塊記憶體,然後用這個句柄在另一個程序中鎖定這個句柄,得到的始終是個nil

2004-09-17 17:39:57 A1.Aleyn.wu(45198124)

對,我也是這樣。

2004-09-17 17:42:54 肖宇(236309574)

請問各位有無寫需求分析的資料?

2004-09-17 17:43:23 A1.Aleyn.wu(45198124)

今天的會議到些結束,下次會議再繼續。

2004-09-17 17:43:49 A1.Aleyn.wu(45198124)

今天的内容明天應該可以看得到了。

2004-09-17 17:44:16 B1.斜陽(249208513)

還是參數不對勁,一定是可以的

2004-09-17 17:44:33 A1.Aleyn.wu(45198124)

我試了幾個參數,都不行。

2004-09-17 17:44:52 B1.斜陽(249208513)

不過共享記憶體還有其它的辦法

2004-09-17 17:45:23 A1.Aleyn.wu(45198124)

共享記憶體就不是今天讨論的内容了。[:D]

2004-09-17 17:48:46 B1.斜陽(249208513)

如果對記憶體的運作了如指掌了,那還有什麼不能作的呢[:D]

2004-09-17 17:49:40 飄塵(43745429)

共享記憶體講一講

2004-09-17 17:49:52 飄塵(43745429)

斜陽講一講了

2004-09-17 17:50:14 飄塵(43745429)

怎麼樣操作其它程式的記憶體區

2004-09-17 17:51:09 B1.斜陽(249208513)

這個我了解的也不是多,大約是可以通過Dll中的構造或者區域對象吧

2004-09-17 17:51:33 飄塵(43745429)

誰會呀

2004-09-17 17:52:17 飄塵(43745429)

武松出來講

2004-09-17 17:52:18 B1.斜陽(249208513)

你看看 參透Delphi這本書的最後,那上面講了一種方法

2004-09-17 17:58:23 A1.Aleyn.wu(45198124)

下班了[go],明天見[bye]。

繼續閱讀