2017-02-02 3 views
2

Допустим, что у меня есть такой код в моем блоке:Delphi ссылка на объект в конструктор

TClass = class(tobject) 
// ... implementation ... 
end; 

TControl = class(tobject) 
private 
    FCheck: TClass 
public 
    constructor Create(value: TClass); 
    // ... implementation... 
end; 

constructor TControl.Create(value: TClass); 
begin 
FCheck := value; 
end; 

Как вы можете видеть, класс управления собирается принять TClass в качестве параметра в конструкторе, так что мне нужно чтобы сделать что-то вроде этого:

//The 'a' is a TClass that has already been created 

c := TControl.Create(a); 
try 
//... do what I need ... 
finally 
c.Free; 
end; 

Это очень простой: я собираюсь использовать a в качестве параметра конструктора, но я не могу понять, если то, что я делаю это безопасно. У меня есть утечка памяти?

В конструкторе я делаю FCheck := value, и я думаю, что это правильно, потому что я передаю ссылку на объект. Должен ли я реализовать деструктор в TControl, чтобы освободить FCheck? Я не могу понять, правильно ли я управляю объектом FCheck.

ответ

3

Нет, вам не нужно уничтожать этот объект из класса, если у него уже есть владелец из другого места. Тем не менее, вы на 100% больше того, что на самом деле принадлежит ему, но у него должен быть только один владелец. Значение - класс, который отвечает за время жизни этого экземпляра. Все зависит от ваших конкретных требований. Сначала это можно было бы использовать в одном месте, а затем в какой-то момент вы можете передать собственность другому. В вашем случае можно передать его в этот конструктор, а затем считать, что владелец. Если это так, то да, вам нужно уничтожить его из класса. Но опять же, он должен иметь только одного владельца в любой момент времени.

+0

Я собираюсь использовать объект a, но я его не освобожу. Когда я освобождаю c, мне нужно освободить FCheck или нет? a является общедоступным и создается в форме create, c создается в процедуре –

+1

@RaffaeleRossi Обычно объекты должны освобождаться только тем же классом, который его создал. Вам никогда не придется беспокоиться о том, чтобы освободить его где-нибудь еще, если у вас нет возможности передать собственность другому. «Собственность» в этом смысле означает только ответственный класс. –

+0

Aaah ok получил это. Так что я делаю нормально, потому что FCheck все равно умрет, когда я позвоню c.Free. Верный? Собираюсь принять –

Смежные вопросы