|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
Всем доброго дня, мучают сомнения. 1. приведёт ли уничтожение обьекта после помещения его в коллекцию TDictionary к уничтожению его и в коллекции TDictionary? 2. Надо ли проходить TDictionary и уничтожать добавленные в него обьекты перед уничтожением TDictionary? 3. Если через AddOrSetValue заменяю значение в коллекции удаляет ли TDictionary старый помещённый в это место обьект? другими словами TDictionary хранит ссылки или клонирует помещённые в него обьекты? если глянуть в исходники выглядит как хранение ссылки: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
но в найденных примерах работы нигде не вижу удаления обьектов в коллекции перед удалением самой коллекции. Если обьекты не удаляю то ReportMemoryLeaksOnShutdown := True; утечек не показывает. Но как то сомнительно это всё. Спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 14:42 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun, см doOwnKeys, doOwnValues ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 14:43 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun другими словами TDictionary хранит ссылки или клонирует помещённые в него обьекты? В Delphi нет универсальной операции клонирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 14:47 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
softwarer hlopotun другими словами TDictionary хранит ссылки или клонирует помещённые в него обьекты? В Delphi нет универсальной операции клонирования. если ссылки то как он тогда поступает с обьектом при замене значения коллекции? Удаляет его или нет? doOwnKeys, doOwnValues это я так понимаю больше про TObjectDictionary, шас почитаю про него. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 14:53 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
тут вылазит другая засада: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 15:23 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
заменил на ExtractPair ошибка ушла, но всеравно непонятно почему она возникала ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 15:29 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun, зато теперь вываливается C0000005 в конце: Код: pascal 1. 2. 3.
где бы хороший пример увидеть ... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 15:34 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
а если убираю FIPs.Free в конце ошибки нет и утечек тоже не показывает. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 15:37 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun, https://docwiki.embarcadero.com/CodeExamples/Sydney/en/Generics_Collections_TDictionary_(Delphi) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 15:42 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun// Тут при попытке удаления из очереди вываливается C000005 Дай угадаю: где-то между точек спрятался вызов lIPz.Free?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 15:54 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov hlopotun// Тут при попытке удаления из очереди вываливается C000005 Дай угадаю: где-то между точек спрятался вызов lIPz.Free?.. нет, вставил перед удалением коллекции FIPs.Clear; а уже потом FIPs.Free; и ошибка ушла. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 15:58 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotunвставил перед удалением коллекции FIPs.Clear; а уже потом FIPs.Free; и ошибка ушла. А ещё через пять лет, когда этой пляски с бубном станет недостаточно и говнокод опять упадёт, ты снова будешь на этом форуме говорить "ну это же пять лет работало, значит ошибки нет". В морг. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 16:05 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun тут вылазит другая засада: Код: pascal 1. 2. 3. 4. 5. 6. 7.
После FIPs.Remove нужно сразу Break делать. Иначе спилишь сук, на котором сидишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 17:23 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
DmSer, да, спасибо. там рекурсия после удаления и break. Тут упрощённый вариант. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 17:37 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun, хотя рекурсия тут пожалуй тоже идея не очень. Редкий случай когда GOTO пригодится. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 17:39 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun мучают сомнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 17:43 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
Код: pascal 1.
и никаких рекурсий и GOTO ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 17:45 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
Код: pascal 1. 2. 3. 4. 5.
Так нельзя писать... Keys это не собственный массив, это указатель на перечислитель. Вы когда вызываете Remove, у вас массив ключей уменьшается, а перечислитель тот же и в какой-то момент у вас индекс превышает кол-во элементов, либо указывает не на тот элемент, потому что вы же удаляете из массива элементы. Чтобы так можно писать надо как указали выше Код: pascal 1. 2. 3. 4. 5.
Нужно сделать копию массива ключей и перебирать его, удаляя значения из словаря. А ошибки в TDictionary не происходило потому что везло, вы же память не освобождали объектов. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 18:30 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
всем спасибо, получается примерно так, проход в обратном порядке и удаление по условию Код: pascal 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 10:31 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun, Песец у тебя тормоза на больших словарях будут. TDictionary не приспособлен для доступа по номеру. Это только в моем THashTable есть. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 10:36 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
rgreat, тогда так получается: Код: pascal 1. 2. 3. 4. 5.
спасибо за замечания ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 10:44 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
Код: pascal 1. 2. 3.
(Лишниe Begin End) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 10:56 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
hlopotun Код: pascal 1. 2. 3. 4. 5.
Код: pascal 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 11:13 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
_Vasilisk_ Тогда уже так Код: pascal 1. 2. 3. 4.
FIPs.Pirs.ToArray наверное FIPs.Keys.ToArray ? Pairs по логике но его в TDictionary нет вроде. Может Items ? но его в ToArray не запихнуть ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 11:23 |
|
Несколько вопросов по TDictionary
|
|||
---|---|---|---|
#18+
Пройтись по ключам, собрать в список нужные. Потом пройтись по списку нужных и удалить из словаря значения. Если удалять немногие из большого списка то выйдет существенная экономия в памяти да и в скорости в сравнении с ToArray ... |
|||
:
Нравится:
Не нравится:
|
|||
14.09.2021, 12:07 |
|
|
start [/forum/topic.php?desktop=1&fid=58&tid=2037027]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 270ms |
total: | 412ms |
0 / 0 |