Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
Jagare
Member

Откуда:
Сообщений: 22
Допустим,что есть некая ф-я которая возвращает объект:
Function somefun(someprm: integer; defobj:tsomeclass = nil): tsomeclass;
Begin
If someprm<>0 then ... else result:= defobj
End;

И в теле другой процедуры пишем:
a:= somefun(b).c;

Будет ли здесь утечка памяти, ведь объект не инициализирован.
Хотя сам чувствую, что будет и надо бы перед этой строкой инициализировать объект, а ниже его уничтожить, но:
- tsomeclass требует оунера (пока не вижу нужды в конкретике)
- на freeandnil, если делать инициализацию/уничтожение, даёт ошибку.
Может быть надо инициализировать оунера, потом его собственность tsomeclass. Потом уничтожать оунера и someclass последует за ним? Пробовал так, но someclass не уничтожается после фриенднила оунера.
Так можно ли сделать сабж и забыть про этот страшный сон?
2 сен 18, 09:50    [21661580]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2808
Jagare,

безотносительно всех написанных странностей главный вопрос остался за кадром: зачем всё это безобразие?
2 сен 18, 11:04    [21661612]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
Jagare
Member

Откуда:
Сообщений: 22
makhaon,
Есть код стиля, есть функция, которая возвращается tcxstyle, надо получить значение color и textcolor для этого кода.
Но меняет ли это суть вопроса?
2 сен 18, 11:14    [21661617]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Никакой утечки не будет. Надо бояться access violation, который вылезет, если внутри этого метода "c" есть обращения к внутренностям объекта, которые на момент вызова не инициализированы и "содержат мусор".

P.S. Незачем скрывать свой код. Тем более, если там участвуют сторонние компоненты типа девок -- у них есть куча особенностей. И вообще, есть свои методы для работы с теми же стилями. Надо рассказать об оригинальной задаче и уже по ней спрашивать.
2 сен 18, 11:29    [21661625]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1882
Подключенный fastmm в режиме fulldebug даст тебе больше ответов чем форум
2 сен 18, 16:52    [21661819]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
Котовасия
Member

Откуда:
Сообщений: 269
white_nigger,

ну вот ко всем тараканам еще и фастмм ему, да-да.

Jagare,

Что значит "объект (не) инициализирован"?
Создан/не создан, что ли? Если есть опасения, что объект не создан, перед использованием его - проверяй. С нил сравнивай, раз твоя функция либо возвращает объект, либо возвращает нил.
Если проблема во времени жизни объекта ("кто должен убивать уже ненужные объекты ") - то тут все зависит от конкретной ситуации. Если твоя функция сама создает объекты, то, возможно, после использования объектов ты должен сам их освобождать. А возможно - не должен, если объекты создаются в контейнере, отвечающем за время жизни вложенных объектов. А если твоя функция лишь возвращает ссылку на существующие объекты - то, скорее всего, их убивать не следует.
В общем, все зависит от ситуации, ты должен сам знать, что делаешь, волшебных рецептов нет.
Такие дела.
2 сен 18, 17:06    [21661826]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1882
Котовасия,
... вот именно поэтому я и дал такой совет, вместо того чтобы городить "простынь"-угадайку
2 сен 18, 18:00    [21661848]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 216
Я как понимаю, первый аргумент функции принимает Self объект в памяти, который может бы уже где - то освобождённым. По этому ТС то и думает, что объекта может и не быть уже по тому адресу который бы он мог вернуть. И хочет вернуть другой объект который будет по умолчанию.

Только непонятно зачем же он взял и обкорнал функцию. По рукам его за этоКартинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.Картинка с другого сайта.
2 сен 18, 23:55    [21662099]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
Jagare
Member

Откуда:
Сообщений: 22
JaDi, c это всего-лишь свойство.
Благодарю за ответ с утечкой успокоили.
Но почему всё-таки не получается уничтожить объект?
5 сен 18, 22:30    [21666331]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
Котовасия
Member

Откуда:
Сообщений: 269
Jagare
JaDi, c это всего-лишь свойство.
Благодарю за ответ с утечкой успокоили.
Но почему всё-таки не получается уничтожить объект?

С чего решил, что утечки не будет? Если ты не понимаешь, что делаешь - обязательно будет.
5 сен 18, 22:35    [21666338]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
JaDi
Member

Откуда: Сызрань, Россия
Сообщений: 3651
Jagare,

Если в параметре будет реально не инициализированный объект передаваться (не nil, а именно случайный мусор) -- то гарантированно никак не уничтожить.

Поэтому надо найти код, который вызывает somefun() и в нем убедиться, чтобы передавался или реальный объект, или nil. Тогда внутри самой функции можно спокойно вызвать FreeAndNil(defobj) -- он гарантированно освободит объект (и вообще, именно эту конструкцию с FreeAndNil и рекомендуют использовать для уничтожения).
5 сен 18, 22:57    [21666360]     Ответить | Цитировать Сообщить модератору
 Re: Можно ли использовать использовать объект, возвращаемый функцией без инициализации объекта  [new]
Eugene New
Member

Откуда:
Сообщений: 73
Jagare,

будет не утечка памяти, а Access Violation либо плавающий глюк, что еще хуже. Такой глюк потом можно месяц искать. Если вы что то возвращаете из функции, вы обязаны ВСЕГДА это инициализировать, даже если это не объект. Вам warning компилятор не просто так выдает.

Поэтому поставьте хотя бы
Result := nil
в начале процедуры.

А вообще ваш код это лютый ужас. Но чтобы его исправить надо знать больше, для чего вам это пришло в голову делать.
6 сен 18, 01:35    [21666455]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить