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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2011, 00:00   #1
KoBRaAndrey
Форумчанин
 
Регистрация: 01.10.2009
Сообщений: 302
По умолчанию Создан ли FileStream

Создана ли переменная типа TFileStream?
Код:
showmessage(booltostr(assigned(musicfile)));
musicfile:=tfilestream.Create('test',fmcreate);
showmessage(booltostr(assigned(musicfile)));
musicfile.Free;
showmessage(booltostr(assigned(musicfile)));
Выводит что переменная существует после освобождения.
KoBRaAndrey вне форума Ответить с цитированием
Старый 25.04.2011, 00:10   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Free удаояет объект на который ссылается переменная, но не саму ссылку(значение переменной).
Freeandnull слелает и то и дркгое.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 25.04.2011, 09:16   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

evg_m +1
фактически ничего не удаляется, просто память, выделенная под объект в конструкторе при его создании,
при вызове деструктора помечается как свободная (т.е. которая может быть выделена при необходимости).

KoBRaAndrey
вместо: musicfile.Free;
напишите:
Код:
FreeAndNil(musicfile);

Последний раз редактировалось Serge_Bliznykov; 25.04.2011 в 09:18.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2011, 04:32   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

См. http://www.gunsmoker.ru/2011/04/windows-spin-off.html - миф №14.

P.S.
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
фактически ничего не удаляется
Неправда. Зависит от менеджера памяти. Он может и сразу освобождать.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 26.04.2011, 08:28   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от GunSmoker
Неправда. Зависит от менеджера памяти. Он может и сразу освобождать.
GunSmoker,
а можно чуть-чуть поподробнее? Мы же сейчас про Delphi говорим?
Там разные менеджеры памяти в зависимости от версии Delphi?
И в каком случае может сразу освобождать?



p.s. кстати, у Вас в заголовке, где описываются мифы написан текст, который является мифом? Или является истиной?
дело в том, что
Цитата:
Миф №14: Obj.Free не приводит к Obj = nil
Это не миф. не приводит. О чём, собственно ниже в тексте и сказано...
Может стоит изменить заголовок данного мифа на действительно мифический?!

Последний раз редактировалось Serge_Bliznykov; 26.04.2011 в 08:33.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2011, 11:49   #6
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Мы же сейчас про Delphi говорим?
Да.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Там разные менеджеры памяти в зависимости от версии Delphi?
Да.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
И в каком случае может сразу освобождать?
Разве это не очевидно?

Менеджер памяти рано или поздно должен освобождать занятые блоки памяти. Да, он может придержать память (либо потому что в ней ещё выделены под-блоки, либо как кэш, чтобы экономить в будущем на выделении памяти), но это необязательно - и часто не происходит. В противном случае это будет означать, что программа на Delphi вообще не освобождает память!

Подумайте и о таком варианте:

Код:
function GetMemPassThrough(Size: Integer): Pointer;
begin
  Result := VirtualAlloc(nil, Size, MEM_COMMIT or MEM_RESERVE, PAGE_READWRITE);
end;

function FreeMemPassThrough(P: Pointer): Integer;
begin
  VirtualFree(P, 0, MEM_RELEASE);
  Result := 0;
end;

function ReallocMemPassThrough(P: Pointer; Size: Integer): Pointer;
begin
  // ...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MM: TMemoryManager;
begin
  MM.GetMem := GetMemPassThrough;
  MM.FreeMem := FreeMemPassThrough;
  MM.ReallocMem := ReallocMemPassThrough;
  SetMemoryManager(MM);
end;
Если кажется, что это краевой случай - подумайте про x64. С неслабой вероятностью там будет использоваться HeapAlloc или кто-то вроде него - потому что переписывание FastMM на x64 - очень нетривиальная задача.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
p.s. кстати, у Вас в заголовке, где описываются мифы написан текст, который является мифом? Или является истиной?
дело в том, что
Это не миф. не приводит.
Так там и стоит: confirmed.

Заголовок выбран именно таким как раз по этой причине:

Цитата:
musicfile.Free;
showmessage(booltostr(assigned(musi cfile)));
Т.е. 99% новичков этого не ожидают.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 26.04.2011, 11:52   #7
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

P.S. Изначально я это вообще к тому говорил, что

Цитата:
Free удаояет объект на который ссылается переменная, но не саму ссылку(значение переменной)
и

Цитата:
память, выделенная под объект в конструкторе при его создании, при вызове деструктора помечается как свободная
никак не связаны.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TreeView, Record, FileStream JoLan Общие вопросы Delphi 18 17.01.2011 11:15
FileStream Read и массив байтов bondik Общие вопросы .NET 5 06.10.2010 22:36
Проблемы с FileStream Gauss Общие вопросы .NET 10 13.09.2010 17:16
FileStream. Как узнать сколько байтов в Read и Write надо написать? Манжосов Денис :) Помощь студентам 2 24.10.2008 08:29
FileStream ryton Общие вопросы Delphi 9 26.05.2008 13:53