|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Тип функции TStrings. Будет утечка памяти?
Код:
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. |