Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2011, 18:00   #1
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию Программа "ест" память, потом сбой

Добрый день
Программа была написана для проверки работоспособности процедур компресии-декомпресии графического файла с использованием Zlib в Делфи2010
Код:
unit main;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Zlib;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    procedure Button1Click(Sender: TObject);
    procedure Compress;
    procedure DCompress;
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  pic1: TMemoryStream;
  pic2: TMemoryStream;
  pic3: TMemoryStream;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject); //при нажатии на кнопку
begin
  if FileExists(ExtractFilePath(Application.ExeName)+'\'+'s1.bmp') then
          DeleteFile(ExtractFilePath(Application.ExeName)+'\'+'s1.bmp');//удаляется файл
  pic1 := TMemoryStream.create;//создаются потоки
  pic2 := TMemoryStream.create;
  pic3 := TMemoryStream.create;
  pic1.LoadFromFile(ExtractFilePath(Application.ExeName)+'\'+'s.bmp');//в поток загружается файл с диска
  Compress;//файл сжимается  и передается в ПЕРЕМ pic2
  DCompress;//файл декомпрессируется и передается в pic3
  pic3.SaveToFile(ExtractFilePath(Application.ExeName)+'\'+'s1.bmp');//файл сохраняется на диск
  Image1.Picture.bitmap.LoadFromFile(ExtractFilePath(Application.ExeName)+'\'+'s1.bmp');//файл отображается в окне, для контроля

  pic1.Free;//уничтожение ПЕРЕМ
  pic2.Free;
  pic3.Free;

  end;

 procedure TForm1.Compress;//процедура сжатия, не мое
var
  TmpStream : TMemoryStream;
  CmpStream : TCompressionStream;
begin
  TmpStream := TMemoryStream.Create;
  CmpStream := TCompressionStream.Create (clMax, TmpStream);
 // application.ProcessMessages;
  pic1.Seek (0, 0);
  CmpStream.CopyFrom (pic1, pic1.Size);
  CmpStream.Free;
//  FCompressionRate := 100 - TmpStream.Size / _in.Size * 100;
  TmpStream.Position:=0;
  pic2.Position:=0;
  pic2.SetSize(TmpStream.Size);
  pic2.CopyFrom (TmpStream, TmpStream.Size);
  TmpStream.Free;
end;

procedure TForm1.DCompress;// процедура декомпресии, не мое
const
  BufSize = 1024;
var
  Buf : pointer;
  Readed : Integer;
  FDecompressedStream:TMemoryStream;
  DecompStream : TDecompressionStream;
begin
      pic2.Seek (0, 0);
        DecompStream := TDecompressionStream.Create(pic2);
        try
            FDecompressedStream := TMemoryStream.Create;
            GetMem (Buf, BufSize);
            try
              repeat
                Readed := DecompStream.read (Buf^, BufSize);
                if Readed > 0
                  then FDecompressedStream.Write (Buf^, Readed);
              until Readed <= 0;
            finally
              FreeMem (Buf, BufSize);
            end;
        finally
          DecompStream.Free;
        end;
        FDecompressedStream.Seek (0, 0);
        pic3.Seek (0, 0);
        pic3.CopyFrom(FDecompressedStream, FDecompressedStream.Size);
end;
end.
В общем программа работает, но при каждом нажатии на кнопку отбирает все больше памяти(4-12-20- и далее мб)
Все Переменные после использования уничтожаются
В чем может быть проблема?
Pcrepair вне форума Ответить с цитированием
Старый 30.06.2011, 21:33   #2
Хамяг
Форумчанин
 
Аватар для Хамяг
 
Регистрация: 22.08.2008
Сообщений: 105
По умолчанию

а где FDecompressedStream уничтожается?
Хамяг вне форума Ответить с цитированием
Старый 01.07.2011, 08:24   #3
Pcrepair
Форумчанин
 
Регистрация: 04.01.2011
Сообщений: 267
По умолчанию

сразу после
Код:
pic3.CopyFrom(FDecompressedStream, FDecompressedStream.Size);
Pcrepair вне форума Ответить с цитированием
Старый 01.07.2011, 08:37   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Pcrepair Посмотреть сообщение
сразу после
Код:
pic3.CopyFrom(FDecompressedStream, FDecompressedStream.Size);
Там что не полный код или команды-невидимки?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическая память или кнопка "Отмена" и "Назад" Ilnour1986 Microsoft Office Excel 2 27.10.2009 04:49
Паскаль.Программа "Верификация", "Кака бригадиру разделить заработанные деньги?".Сложные Valik102 Помощь студентам 11 23.06.2009 15:30
Паскаль.Программа "Верификация", "Кака бригадиру разделить заработанные деньги?".Сложные Valik102 Паскаль, Turbo Pascal, PascalABC.NET 3 23.06.2009 09:11
login@domain.com;pass она должна брать сначала только "login" потом "domain.com" и на последок "pass" AquaKlaster Общие вопросы Delphi 4 05.04.2009 17:31
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51