Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Вниз
Stream - пустой / не пустой Найти похожие ветки
← →
kobik. (2006-08-07 06:37) [0]Пусть есть процедура с VAR параметром - TMemoryStream, которая производит с ним какие-то действия. MemoryStream в любом случае нужен пустой, а если он не создан, то должен создаться в этой процедуре.
Вот у меня встал вопрос, как это грамотно сделать.
1)MemoryStream:=TMemoryStream.Create;
Но ведь если он был создан раньше, то останется кусок неосвобожденной памяти.
2)if MemoryStream <> nil then MemoryStream.Free;
MemoryStream:=TMemoryStream.Create;
А вдруг тот MemoryStream был локальной переменной какой-нибудь функции. Тогда он может быть неравен nil, но при этом MemoryStream.Free приведет к вылету.
3)try
if MemoryStream <> nil then MemoryStream.Free;
finaly
MemoryStream:=TMemoryStream.Create;
end;
Тут уже вопрос, а не лишнее ли это? Может про первые 2 случая я вообще бред сморозил :)
Расскажите как правильно делать?
← →
Loginov Dmitry © (2006-08-07 08:01) [1]До первого вызова функции очень желательно ссылку на объект обнулить (если переменная глобальная, то не нужно). А в функции достаточно следующего:
if MemoryStream = nil then
MemoryStream := TMemoryStream.Create;
А в [0] бредовые "варианты": 1) (Утечка памяти) и 3) (непонимание того, что такое try .. finally .. end)
← →
Desdechado © (2006-08-07 11:37) [2]Инициализировать переменные "где попало" ("А вдруг тот MemoryStream был локальной переменной какой-нибудь функции") - дурной тон и прямой путь к скрытым ошибкам.
Если в какую-то функцию нужно передать TMemoryStream (да и любой другой объект) очень рекомендуется его создать заранее и передаватьне через VAR (объекты и так по ссылке передаются). Разрушать объекты после использования очень рекомендуется в том же логическом участке кода, где они созданы. Особенно это касается временных объектов.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.44 MB
Время: 0.094 c