Извините, что поднял такую старую тему, но хочется уяснить для себя раз и на всегда.
Я сам всегда делал так:
- Код: Выделить всё
Type
{ TLayer1DPC }
PLayer1DPC =^TLayer1DPC;
TLayer1DPC = class //Слой материала (кристалл)
// -----
PLayer :=New(PLayer1DPC); //готовим новый указатель
PLayer^:=TLayer1DPC.Create; //Создаем класс на который указывает указатель
Layers.Add(PLayer); //Запихиваем в листинг
Layers имеет тип TList;
И дальше пользовался.. когда надо было удалить память делал так:
- Код: Выделить всё
procedure ClearLayerList;
var Index:Integer;
begin
While Layers.Count>0 do
begin
Index:=Layers.Count-1; //Если удалять с конца так быстрее
PLayer1DPC(Layers.Items[Index])^.Free; //Уничтожение слоя как класс
Dispose(PLayer1DPC(Layers.Items[Index]));//Освобождение памяти выделенной New
Layers.Delete(Index);
end;
end;
Это код работает на ура уже 3 года.
Но если при создании класса (вне зависимости от видимости переменной) он будет существовать до тех пор пока не будет вызван Free, то получается что действительно указатель на класс лишний, Для С\С++ получается указатель
необходим, потому что при выходе из функции локальные переменные уничтожаются (для классов вызывается Free).
А указатель нет, будет существовать до тех пор пока не вызовем Dispose.
Я правильно понял?.
Согласно вот этому Reference guide for Free Pascal, version 2.2.4 (стр 64):Manual писал(а):The extended syntax of new and dispose can not be used to instantiate and destroy class instances.
That construct is reserved for use with objects only. Calling the constructor will provoke a call to
getmem, to allocate enough space to hold the class instance data. After that, the constuctor’s code
is executed. The constructor has a pointer to its data, in Self.
Не может быть использован, но почему тогда мой код выше работал, и ни разу не подвел в течении 3 лет?.. может я не правильно перевл, если Да, тогда я вообще ничего не понимаю.
Т.е. код выше можно делать вообще так:
- Код: Выделить всё
Type
{ TLayer1DPC }
PLayer1DPC =^TLayer1DPC;
TLayer1DPC = class //Слой материала (кристалл)
// -----
Layer:=TLayer1DPC.Create; //Создаем класс на который указывает указатель
Layers.Add(@Layer); //Запихиваем в листинг
И дальше пользовался.. когда надо было удалить память делал так:
- Код: Выделить всё
procedure ClearLayerList;
var Index:Integer;
begin
While Layers.Count>0 do
begin
Index:=Layers.Count-1;
TLayer1DPC(Layers.Items[Index]^).Free; //Уничтожение слоя как класс
Layers.Delete(Index);
end;
end;
Это так?