powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Вопросы по IT / Статические классы и дженерики (Delphi)
6 сообщений из 6, страница 1 из 1
Статические классы и дженерики (Delphi)
    #788225
Droog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я добавил в свою Delphi-программу сборщик мусора, который описан в этой теме. Довольно быстро нашёл несколько старых багов (неудаляемые классы). Но ReportMemoryLeaksOnShutdown показывает, что есть ещё неудаляемый мусор – видимо, динамические массивы, которых я где-то не освобождаю. Из-за этого при некоторых условиях моя программа может вылететь с out of memory.
Чтобы разобраться с этими проблемами, я хочу переписать свои динамические массивы. Можно переделать их всех в классы: я давно использую такие классы:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
TIntArray=class(TSafeObject)
private
fitems:pintarr;
fcount,fcapacity:integer;
procedure SetCapacity(newcapacity:integer);
procedure SetCount(newcount: integer);
function GetItem(index: integer): integer;
procedure SetItem(index: integer; Value: integer);

public
property Capacity:integer read fcapacity write SetCapacity;
property Count:integer read fcount write SetCount;
property Items[index:integer]:integer read GetItem write SetItem; default;
procedure Assign(otherarray:tintarray);
procedure RoundAssign(othervalarray:tdoublearray);
function Find(value:integer):integer;
procedure Clear;
procedure Grow;
procedure Add(value:integer);
procedure AddNew(value:integer);//Добавляет элемент, если его еще нет в массиве
procedure AddArray(otherarray:tintarray);
procedure AddNewValuesFromArray(otherarray:tintarray);
procedure Delete(index:integer);
procedure SwapPoints(pointnum1,pointnum2:integer);//меняет местами два элемента
procedure MoveItemToTheFirst(itemnum:integer);//переводит указанный элемент в начало массива
//(остальные элементы сдвигаются на единицу вверх)
procedure ExcludeOtherArray(otherarray:tintarray);//Удаляет все элементы, входящие во второй массив.
procedure KeepOtherArray(otherarray:tintarray);//Оставляет только элементы, входящие во второй массив.
procedure SetBackPointers(otherarray:tintarray);//Во втором массиве должны находиться указатели
//на текущий (не повторяющиеся); в items расставляются номера этих указателей или -1, где их нет.
//Перед вызовом должен быть установлен count
function GetUniqueValsNumbers:tintarray;//Возвращает массив, состоящий из 0, 1, 2..., соответствующим
//уникальным числам в исходном массиве
procedure Sort(ascending:boolean);
procedure FillWithValues(valuesbeg,valueslast:integer);
procedure IncValues(add:integer);
procedure AddToStream(stream:tstream);
procedure ReadFromStream(stream:tstream);
procedure WriteToStream(stream:tstream);
destructor Destroy; override;
end;
Эти классы всем хороши, за исключением того, что они относительно медленные – это ссылка на ссылку и ещё на ссылку (точнее на индекс). Поэтому, возможно, правильнее использовать вместо них такие record-ы:
Код: Delphi
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
type
TRiIntArray=record
FItems:pintarr;
FCount,FCapacity:integer;
FTag:integer;
procedure SetCapacity(newcapacity:integer);
procedure SetCount(newcount: integer);
function GetItem(index: integer): integer;
procedure SetItem(index: integer; Value: integer);
property Capacity:integer read fcapacity write SetCapacity;
property Count:integer read fcount write SetCount;
property Items[index:integer]:integer read GetItem write SetItem; default;
procedure Assign(otherarray:triintarray);
function Find(value:integer):integer;
procedure Clear;
procedure Grow;
procedure Add(value:integer);
procedure Delete(index:integer);
procedure Sort(ascending:boolean);
procedure AddToStream(stream:tstream);
procedure ReadFromStream(stream:tstream);
procedure WriteToStream(stream:tstream);
procedure Initialize;
procedure Finalize;
end;
Я не знаю, корректно ли называть такие record-ы статическими классами? У них есть инкапсуляция, но нет наследования и полиморфизма (кстати наследование в принципе было бы несложно сделать для авторов ЯП).

С этими record-ами возникает проблема – трудно их писать для каждого нового типа данных. Может тут помогут дженерики в Delphi; я раньше с ними не работал, подскажите кто знает – легко ли с помощью дженериков превратить этот TRiIntArray в массив, содержащий элементы другого типа? Примеры с дженериками, которые я видел, работают только с классами.
...
Изменено: 06.12.2018, 10:17 - Droog
Рейтинг: 0 / 0
Статические классы и дженерики (Delphi)
    #788233
Green2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей кроме]
[не активирован]
sql server
Flash
Windows
1C
Unity3D
Проблема с утечкой памяти?
...
Рейтинг: 0 / 0
Статические классы и дженерики (Delphi)
    #788996
Droog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Green2  06.12.2018, 10:20
Проблема с утечкой памяти?
Да.
...
Рейтинг: 0 / 0
Статические классы и дженерики (Delphi)
    #790571
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
Droog  06.12.2018, 13:51
Green2  06.12.2018, 10:20
Проблема с утечкой памяти?
Да.
купи еще!!!
...
Рейтинг: 0 / 0
Статические классы и дженерики (Delphi)
    #790586
Енот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNose  06.12.2018, 19:30
Droog  06.12.2018, 13:51
Green2  06.12.2018, 10:20
...
Да.
купи еще!!!
Можно на ютуб бесплатно высерать, как пашэ делал
...
Рейтинг: 0 / 0
Статические классы и дженерики (Delphi)
    #790926
Конякула
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[игнорирует гостей]
Шут - адвокат разума
eNose  06.12.2018, 19:30
Droog  06.12.2018, 13:51
Green2  06.12.2018, 10:20
...
Да.
купи еще!!!
Плохой совет. За неосвобождение выделенной явно памяти надо пиздить ногами, а не предлагать купить ещё.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Вопросы по IT / Статические классы и дженерики (Delphi)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]