|
|
|
Почему в этом коде утечка памяти
|
|||
|---|---|---|---|
|
#18+
Код: pascal 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. 42. 43. 44. 45. 46. 47. 48. 49. 50. Вопрос к знатокам: Почему в этом коде появляются утечки памяти. Delphi XE7. Глюк? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 22:18 |
|
||
|
Почему в этом коде утечка памяти
|
|||
|---|---|---|---|
|
#18+
Очевидно, что потому, что нигде не освобождается объект класса, который создается здесь:ziv-2014 Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 22:32 |
|
||
|
Почему в этом коде утечка памяти
|
|||
|---|---|---|---|
|
#18+
Бажина компилятора... Надо так писать: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.03.2018, 22:40 |
|
||
|
Почему в этом коде утечка памяти
|
|||
|---|---|---|---|
|
#18+
Это не баг, скорее, неочевидная особенность. Объект, реализующий интерфейс, автоудаляется в момент уменьшения счётчика ссылок с 1 до 0. Однако в примере счётчик ссылок вообще не будет равен 1 и, следовательно, не сможет сбросится с 1 до 0, т.е. объект не будет автоматически удалён. А счётчик не становится равен 1, ибо у свежесозданного объекта счётчик = 0, а const счётчик не трогает (т.е. остаётся 0). Итого: надо через переменную (тогда счётчик тронется с 0 до 1 и позднее, соответственно, с 1 до 0), либо убрать const, либо и то и другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2018, 00:36 |
|
||
|
Почему в этом коде утечка памяти
|
|||
|---|---|---|---|
|
#18+
GunSmoker, А почему при const не очищается счетчик? Там же везде интерфейсы. Без const все работает без утечек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2018, 09:33 |
|
||
|
Почему в этом коде утечка памяти
|
|||
|---|---|---|---|
|
#18+
ziv-2014, а с чего бы счётчик должен меняться при const, если const именно это и делает: блокирует изменения в переменной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2018, 11:07 |
|
||
|
Почему в этом коде утечка памяти
|
|||
|---|---|---|---|
|
#18+
1) Константные параметры могут передаваться функции по значению или по ссылке, в зависимости от конкретного используемого компилятора. 2) Использование const позволяет компилятору оптимизировать код для структурированных и строковых параметров. 3) Директива const по параметру указывает, что процедура / функция не изменяет значение, указанное в этом параметре. Если процедура или функция захочет манипулировать любым константным параметром, сначала нужно скопировать это значение в локальную переменную. Это позволяет компилятору выполнять некоторые оптимизации по таким параметрам, особенно в области ссылочных типов, таких как строки и интерфейсы и т. д. Конкретно по интерфейсам, поскольку параметр объявлен как const, невозможно, чтобы значение переданной ссылки интерфейса было изменено во время «жизненного цикла» параметра (поскольку компилятор отклонит любой код, который пытается изменить значение), таким образом, компилятор способен устранить вызовы AddRef () и Release (), которые в этой процедуре будут генерироваться другим способом как пролог и эпилог. 4) Смотрим что генерирует компилятор в asm под win32 Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Поэтому передача интерфейсной через const может сыграть злую шутку, если вы будете рассчитывать, что при передаче ее в метод счетчик ссылок будет расти ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.03.2018, 14:14 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=115&tid=2041166]: |
0ms |
get settings: |
9ms |
get forum list: |
22ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 422ms |

| 0 / 0 |
