![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Код:
function test:Tstrings
begin
result:=TStringsList.Create;
result.add('over 1gb text'); // Ж)
end;
procedure blabla;
var
t:TStrings;
begin
t:= test;
memo1.lines.addStrings(t);
t.free;
end;t - как видно освобождаем из памяти, а вот функцию test нет. Или же все нормально? |
|
#2
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Евгений79 (04.10.2012)
| ||
|
#3
|
|||
|
|||
|
Значит командой t.free мы освобождаем и t и функцию?
Ну если нет исключений ![]() |
|
#4
|
||||
|
||||
|
Цитата:
|
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Евгений79 (04.10.2012)
| ||
|
#5
|
|||
|
|||
|
Разжуйте пожалуйста механику процесса, чтобы в голове был порядок.
Если это, конечно, возможно сделать в нескольких предложениях. |
|
#6
|
||||
|
||||
|
все Ok будет
|
|
#7
|
||||
|
||||
|
Цитата:
функция Test создаёт лист и присваивает адрес листа указателю Result, по выходу из этой функции адрес из Result копируется в другой указатель T дальше ты мутишь через указатель с этим списком всё что хочешь и освобождаешь его. утечка возникнет если ты не сделав t.Free сделаешь ещё раз t:= test тогда у тебя в памяти будет 2 листа а указатель будет только на один хорошо про указатели утечки и освобождения памяти вот тут http://www.transl-gunsmoker.ru/2009/09/blog-post.html Последний раз редактировалось Lost_Fish, 04.10.2012 в 10:15. |
| Этот пользователь сказал Спасибо Lost_Fish за это полезное сообщение: | ||
Евгений79 (04.10.2012)
| ||
|
#8
|
||||
|
||||
|
простой пример проверить освобождение объекта:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMyStringList = class(TStringList)
public
destructor Destroy; override;
end;
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TMyStringList }
destructor TMyStringList.Destroy;
begin
Windows.Beep(1000, 100);
inherited Destroy;
end;
function Test: TStrings;
begin
Result:=TMyStringList.Create;
Result.Add('Test');
end;
procedure TForm1.FormCreate(Sender: TObject);
var
t: TStrings;
begin
t:=Test;
Memo1.Lines.Assign(t);
t.Free;
end;
end.-объявляем наследника TStringList -реализуем у него только destructor -функция создает и возвращает наш объект -в Destroy ставим точку останова, если нет бипера -запускаем и наслаждаемся остановкой на точке |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Евгений79 (04.10.2012)
| ||
|
#9
|
||||
|
||||
|
Цитата:
Например в этом месте может закончится память: Код:
result.add('over 1gb text'); // Ж)Или например в этом месте может быть не создан объект memo1: Код:
memo1.lines.addStrings(t); И всякий раз при возникновении исключения мы не будем доходить до освобождения объекта и как следствие получим утечку памяти. А ведь это просто небольшой пример которые имеют тенденцию разрастаться до больших размеров, в которых будет значительно больше шансов на возникновение исключений. |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Евгений79 (04.10.2012)
| ||
|
#10
|
||||
|
||||
|
мне показалось что вопрос был не в том, чтобы отлавливать все возможные исключения, а в самом приеме создания объекта.
если уж на то пошло, то и отлавливать переполнение стека при вызове функции надо ![]() |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Евгений79 (04.10.2012)
| ||
|
#11
|
||||
|
||||
|
Цитата:
тогда Код:
procedure blabla;
var
t:TStrings;
begin
try
t:= test;
memo1.lines.addStrings(t);
finally
t.free;
end;
end;будет разумным решением |
|
#12
|
||||
|
||||
|
Цитата:
Цитата:
![]() Конечно полностью на 100% невозможно защититься от утечки памяти, но нужно стараться свести вероятность этого к минимуму. |
|
#13
|
||||
|
||||
|
продолжим холивар?
Код:
function Test: TStrings;
begin
try
Result:=TStringList.Create;
try
Result.Add('Test');
except
ShowMessage('Вам сегодня не повезло :(');
end;
except
Result:=nil;
ShowMessage('Windows must died');
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
t: TStrings;
begin
try
t:=Test;
if not Assigned(t) then Exit;
try
Memo1.Lines.Assign(t);
finally
t.Free;
end;
except
ShowMessage('Сегодня не Ваш день :)');
end;
end; |
|
#14
|
||||
|
||||
|
Цитата:
![]() |
|
#15
|
|||
|
|||
|
А что если обойтись без переменной t
а сразу в мемо добавлять результат функции memo1.lines.addstrings(test); ? Последний раз редактировалось Евгений79, 04.10.2012 в 13:55. |