Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Почему ADOTable не чистит за собой память ? [D7, ACCESS]


greySerg ©   (2005-07-01 12:03:00) 

есть такой код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}
uses ADODB;

procedure TForm1.Button1Click(Sender: TObject);
var
 at: TADOTable;
 ac: TADOConnection;
begin
 ac := TADOConnection.Create(nil);
 ac.ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0;'+
                        'Data Source=D:\Expert2\NewData\expert.mdb;'+
                        'Persist Security Info=False;'+
                        'Jet OLEDB:System database=C:\System.mdw';
 try
   at := TADOTable.Create(nil);
   try
     at.Connection := ac;
     at.TableName := 'M_DOCUMENT';
     at.CursorType := ctOpenForwardOnly;
     at.ReadOnly := True;
     at.CursorLocation := clUseServer;
     at.LockType := ltReadOnly;
     at.TableDirect := true;
     at.Open;
     while not at.Eof do
     begin
       at.Next;
     end;
   finally
     at.Close;
     at.Free;
   end;
 finally
   ac.Free;
 end;
end;

end.


После прохода всей таблицы выделяется 13 Мб (см. в Windows Task Managere), но я же в конце прохода всё освобождаю (at.Free;), почему память не освобождается ?(в Windows Task Managere вижу те же 13 Мб, вместо 2 Мб, которые были в начале запуска приложения, перед нажатием на кнопку Button1)

Мастера, в чем может быть дело ? ADOTable не освобождает память за собой  ?

P.S.: тестировал на Windows XP SP1


Ломброзо   (2005-07-01 12:21:00) [1]

greySerg   (01.07.05 12:14)
> Johnmen

Как это не разорвал коннект , а ac.Free; что вы думаете означает ?

> Ломброзо

Да, Вы правы , свернул, развернул -и память уменьшилась , это винда не освобождает память занятым приложением, пока в этом нет необходимости , да ?


Я не знаю :) эмпирически замечено. Task manager частенько выдаёт температуру солнца или численность пингвинов, но только не действительно занятую память.

--------
DMJS 0.6 | http://dmjsclient.narod.ru


Digitman   (2005-07-01 12:19:00) [2]


> greySerg


в-третьих, для BMM это нормально


greySerg   (2005-07-01 12:14:00) [3]

> Johnmen

Как это не разорвал коннект , а ac.Free; что вы думаете означает ?

> Ломброзо

Да, Вы правы , свернул, развернул -и память уменьшилась , это винда не освобождает память занятым приложением, пока в этом нет необходимости , да ?


Johnmen   (2005-07-01 12:09:00) [4]

Ну во первых, ты не разорвал коннект.
А во-вторых, ADO не освободит свои "кеши", пока не будет "деинициализировано", т.е. пока не завершишь своё приложение.


Ломброзо   (2005-07-01 12:07:00) [5]

greySerg   (01.07.05 12:03)
есть такой код:


Сверните формочку.
Разверните формочку.
Доложите о результатах.
--------
DMJS 0.6 | http://dmjsclient.narod.ru


Наверх

Титульная страница Поиск, карта сайта Написать письмо