Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 06.03.2012, 18:43
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию освобождение памяти

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
PLoadFiles = ^TLoadFiles;
  TLoadFiles = record
    NameFile: string;
  end;

var
  Form1: TForm1;
  L:TList;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
p:PLoadFiles;
begin
new(p);
p.NameFile:=Memo1.Text;
l.Add(p);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
L:=TList.Create;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
L.Free;
end;

вот пример добавления в TList, но вопрос когда я очищаю его или удаляю элемент, как очистить память занимаемую при создании p?
Ответить с цитированием
  #2  
Старый 06.03.2012, 19:07
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Dispose(P);
Как и любой указатель.

Последний раз редактировалось nixel, 06.03.2012 в 19:12.
Ответить с цитированием
  #3  
Старый 06.03.2012, 19:29
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
Dispose(L.Items[0]);
l.Delete(0);
end;
ты имеешь ввиду так?
не работает
или как перейти то к нему

если при создании то не работет
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
p:PLoadFiles;
begin
new(p);
p.NameFile:=Memo1.Text;
l.Add(p);
Dispose(p);
end;

Последний раз редактировалось ALexandr555, 06.03.2012 в 19:34.
Ответить с цитированием
  #4  
Старый 06.03.2012, 19:37
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Код:
procedure ...
var
  p: PLoadFiles;
begin
  p := PLoadFiles(L.Items[0]);
  Dispose(p);
  L.Delete(0);
end;
И я бы ограничил размерность строкового поля. Например, ShortString использовать (если достаточно 256 символов).
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #5  
Старый 06.03.2012, 19:44
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

спасибо, вроде ок, а размерность для чего? от утечек?
Ответить с цитированием
  #6  
Старый 06.03.2012, 19:46
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от ALexandr555
Код:
procedure TForm1.Button2Click(Sender: TObject);
begin
Dispose(L.Items[0]);
l.Delete(0);
end;
ты имеешь ввиду так?
не работает
или как перейти то к нему
нет, именно Dispose(p);
Только делать это надо в той же процедуре, где он был объявлен. Как ты написал во втором варианте в общем. =)

Что конкретно не работает? Что пишет отладчик?
Ответить с цитированием
  #7  
Старый 06.03.2012, 20:02
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

Цитата:
Сообщение от nixel
нет, именно Dispose(p);
Только делать это надо в той же процедуре, где он был объявлен. Как ты написал во втором варианте в общем. =)

Что конкретно не работает? Что пишет отладчик?
он так не добавляет данные если сразу очищать,
предложенное dr. F.I.N. работает
Ответить с цитированием
  #8  
Старый 06.03.2012, 21:59
nixel nixel вне форума
Начинающий
 
Регистрация: 12.12.2011
Адрес: Москва
Сообщения: 150
Версия Delphi: XE2-U4
Репутация: 131
По умолчанию

Цитата:
Сообщение от ALexandr555
он так не добавляет данные если сразу очищать,
предложенное dr. F.I.N. работает
Логично, учитывая что у поля записи тип string, а Memo1.Text, если не ошибаюсь, TStringList. Стоило брать конкретную строку.
Впрочем, раз уже все работает, то это можно считать оффтопом)
Ответить с цитированием
  #9  
Старый 07.03.2012, 07:32
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от nixel
..., а Memo1.Text, если не ошибаюсь, TStringList. Стоило брать конкретную строку
Ошибаешься
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #10  
Старый 07.03.2012, 09:35
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще-то:

Код:
type
  PLoadFiles = ^TLoadFiles;
  TLoadFiles = record
    Num: Integer;
    NameFile: ShortString;
  end;

var
  AList: TList;    

var
  p: PLoadFiles;
begin
  AList:=TList.Create;
  New(p);
  p^.Num:=0;
  p^.NameFile:='hello';
  AList.Add(p);
  New(p);
  p^.Num:=1;
  p^.NameFile:='world';
  AList.Add(p);
end;

begin
  Dispose(PLoadFiles(AList[1]));
  Dispose(PLoadFiles(AList[0]));
  AList.Free;
end;

begin
  Memo1.Lines.Add(IntToStr(PLoadFiles(AList[0])^.Num));
  Memo1.Lines.Add(PLoadFiles(AList[0])^.NameFile);
  Memo1.Lines.Add(IntToStr(PLoadFiles(AList[1])^.Num));
  Memo1.Lines.Add(PLoadFiles(AList[1])^.NameFile);
end;
ибо PLoadFiles это указатель: PLoadFiles = ^TLoadFiles;
кста, в справке по New это написано:

Цитата:
procedure New(var P: Pointer);

Description

In Delphi code, the New procedure creates a new dynamic variable and sets a pointer variable to point to it. P is a variable of any pointer type. The size of the allocated memory block corresponds to the size of the type that P points to. The newly created variable can be referenced as P^. If there isn't enough memory available to allocate the dynamic variable, an EOutOfMemory exception is raised.

When an application is finished using a dynamic variable created with New, it should dispose of the memory allocated for the variable using the Dispose standard procedure.
там же и пример есть.
__________________
Пишу программы за еду.
__________________

Последний раз редактировалось NumLock, 07.03.2012 в 13:14.
Ответить с цитированием
  #11  
Старый 07.03.2012, 11:48
Аватар для ALexandr555
ALexandr555 ALexandr555 вне форума
Специалист
 
Регистрация: 09.10.2010
Адрес: Тольятти
Сообщения: 803
Версия Delphi: Delphi 7
Репутация: 2064
По умолчанию

у меня не работало
Код:
Dispose(AList[0]);
а вот это вроде да
Код:
  p := PLoadFiles(L.Items[0]);
  Dispose(p);

Код:
 New(p);
  p^.Num:=0;
  p^.NameFile:='hello';
при создании и без ^ нормально
Ответить с цитированием
  #12  
Старый 07.03.2012, 12:40
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 663
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Цитата:
Сообщение от NumLock
...там же и пример есть.
Все верно. Dispose "избавляется" от памяти, равной размеру переменной типа, на которую указывает указатель ( херасе масло масляное). Таким образом, чтобы корректно освободить память надо привести указать к соответствующему типу. Т.е. Dispose(AList[0]); отработает некорректо.
Ну а про p^ - я даже не глянул. Действительно, нужно работать через ^.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #13  
Старый 07.03.2012, 13:19
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ага, про Dispose(PLoadFiles(AList[0])); я сам прозевал) т.к. писал про ^
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:14.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025