@dlangru

Страница 43 из 719
Dmitry
28.07.2016
13:17:28
я так фишку и не просек, зачем отдельно деструктор то делать?

Google
Dmitry
28.07.2016
13:17:44
если его не сделать, то что будет?

Oleg
28.07.2016
13:18:24
а зачем ты тогда соединение закрываешь?

scope(exit) stmt.close(); вот это зачем тогда?

Dmitry
28.07.2016
13:19:51
ну типа функция отработала, запрошенные данные были получены, закрываем соединение, или я что-то не понимаю?

типа его можно оставить активным?

Oleg
28.07.2016
13:20:28
не уверен, но каждый раз его открывать накладно

создал/открыл и работаешь

потом, когда больше тебе оно не нужно закрываешь

деструкторы для этого и нужны, чтобы правильно закрывать соединения, высвобождать ресурсы и тд

но в D не очень всё правильно))))

Dmitry
28.07.2016
13:21:49
а сборщик мусора и тд?

Oleg
28.07.2016
13:22:01
а сборщик мусора откуда знает что делать надо?)

Dmitry
28.07.2016
13:23:00
так. stmt это у нас что? Как его по русски назвать? Его же нужно в деструкторе убивать?

Google
Oleg
28.07.2016
13:23:26
я не знаю что это) это something — какая-то вещь

Dmitry
28.07.2016
13:23:35
Statement stmt;

Oleg
28.07.2016
13:23:53
где ты это вообще нашёл?)

я в базах данных вообще не силён

Dmitry
28.07.2016
13:24:19
в плане? в драйвере https://github.com/buggins/ddbc/

Oleg
28.07.2016
13:24:25
может это какое-то понятие за баз данных

Dmitry
28.07.2016
13:24:45
так, а мне ты и макс что предлагаете дропать то?

Oleg
28.07.2016
13:25:23
мы предлагаем правильно создавать и уничтожать объекты

это не только к драйверам баз относится

если объект имеет метод финализации, который нужно вызвать руками (не деструктор), то его можно записать в деструктор класса, в котором этот объект хранится

ну эт типа подход просто такой

Dmitry
28.07.2016
13:26:57
Так вроде бы сборщик мусора убивает все что выходит за пределы скоупа когда он закрывается или все же нет?

Oleg
28.07.2016
13:27:02
нет

сборщик мусора с классами вообще кисло работает

он может вызвать деструктор, а может и нет

как сочтёт нужным

Dmitry
28.07.2016
13:27:38
тоесть мне написать: ~this() { stmt = conn.createStatement(); scope(exit) conn.close(); } так?

Макс
28.07.2016
13:27:38
this(Config config) { this.config = config; MySQLDriver driver = new MySQLDriver();
Отвечу на это, сорри если уже некропост :) Убери там слово MySQLDriver, а то получается, что ты новую переменную (локальную, внутри функции-конструктора) создал вместо того, чтобы присвоить значение имеющемуся полю.

тоесть мне написать: ~this() { stmt = conn.createStatement(); scope(exit) conn.close(); } так?
Нет, создал-то ты его в конструкторе. А тут просто делай close().

Dmitry
28.07.2016
13:29:04
макс, я убрал вроде бы. Сейчас код так выглядит: http://img.ctrlv.in/img/16/07/28/579a08875c811.png правильно?

Google
Макс
28.07.2016
13:29:33
порядок такой: 1. в конструкторе создал что-то 2. потом используешь свой объект, со всеми его полями 3. в деструкторе удалил что-то

Макс
28.07.2016
13:30:42
а, ну да

Dmitry
28.07.2016
13:30:49
уже в теле функции дальше: http://img.ctrlv.in/img/16/07/28/579a090205df6.png

Oleg
28.07.2016
13:30:57
а произойдёт это только в случае перевыделения памяти

Макс
28.07.2016
13:31:34
уже в теле функции дальше: http://img.ctrlv.in/img/16/07/28/579a090205df6.png
но зачем тогда он тебе как поле? если ты весь (почти) его жизненный цикл внутрь одной функции вместил

Oleg
28.07.2016
13:31:44
следовательно, может быть уже половина объектов будет потёрта, когда будет вызван деструктор и он напорится на то, что обратится к несуществующим уже объектам

Макс
28.07.2016
13:32:43
но в D не очень всё правильно))))
А можно поподробнее, кстати? Что там с деструкторами неправильно? Я не углублялся, не знаю этого.

Oleg
28.07.2016
13:33:10
серьезно?!
чуть ниже описал механизм

смысл в том, что сборщик будет удалять объекты только тогда, когда: 1. они больше не нужны (не ссылок на них) 2. нужна новая память

Oleg
28.07.2016
13:33:57
вот пока не понадобится новая память не будет вызван деструктор

Dmitry
28.07.2016
13:34:07
просто он в двух функциях используется http://img.ctrlv.in/img/16/07/28/579a09c319d34.png

поэтому наверно логично его как поле сделать

Oleg
28.07.2016
13:35:43
если у переменных одно и тоже имя это не значит, что это одни и теже переменные

Макс
28.07.2016
13:36:11
вот пока не понадобится новая память не будет вызван деструктор
а, ты только про это? что слишком долго ждём, по сравнению с тем же scope(exit)?

Oleg
28.07.2016
13:36:33
порядок удаления по умолчанию немного неудобный

сначала вызывается деструктор объемлющего класса, потом его полей

Google
Dmitry
28.07.2016
13:37:06
деструктор с полями класса что делает? или он только то что внутри this удаляет?

Oleg
28.07.2016
13:37:24
деструктор сам ничего не удаляет

деструктор это функция, которая вызывается при удалении

а, ты только про это? что слишком долго ждём, по сравнению с тем же scope(exit)?
столкнулся один раз с проблемой, когда с opengl работал

всю деинициализацию запихивал в деструкторы

а при завершении программы он уже выгружал библиотеку

и из деструктора вызовы к opengl приводили к аказии

поэтому, чтобы правильно высвободить некоторые объекты, нужно быть уверенным в том, что необходимые драйвера/библиотеки/объекты не выгружены/удалены и тд

Dmitry
28.07.2016
13:39:39
так, мне просто ~this() { } вызвать чтоли? или как написать я не понимаю. И в каком месте его вызывать? В последней вызываемой функции? Или вслед за конструктором его определить?

Oleg
28.07.2016
13:39:45
поэтому не всегда подходит деструктор в D для таких задач

Admin
ERROR: S client not available

Dmitry
28.07.2016
13:41:09
а определение деструктора это что? Вызывать без определения нельзя?

Oleg
28.07.2016
13:41:19
чоооо?

определение это сигнатура с телом

вызов это вызов

что ты будешь вызывать, если ты не определил?

Dmitry
28.07.2016
13:41:46
щас погуглю

Oleg
28.07.2016
13:42:08
да и деструктор нельзя вызвать напрямую

можно запустить механизм уничтожения объекта с помощью метода destroy

Google
Oleg
28.07.2016
13:43:14
в С++ можно вызвать деструктор и удалить динамически выделенный объект с помощью ключевого слово delete, которое в D считается depricated

Dmitry
28.07.2016
13:43:47
блин, можно пример или ссылку на документацию. Не понимаю как мне написать.

Oleg
28.07.2016
13:43:57
`

бля

1сек

Dmitry
28.07.2016
13:44:18
правильно я понял, что это просто является хорошей практикой, но не обязательным действием?

Oleg
28.07.2016
13:44:47
class A{ B some; this() { some = new B; } void foo() { some.use(); } void finalize() { some.close(); } }

без деструкторов

помимо some в finalize можно записать всё что нужно закрыть, очистить и тд (кроме того, что управляется gc)

Dmitry
28.07.2016
13:45:35
и просто в конце метод finalize() вызывать?

Oleg
28.07.2016
13:45:52
в конце использования объекта класса A

типа void main() { auto a = new A; a.foo(); ... a.finalize(); }

Dmitry
28.07.2016
13:46:26
так, а если я соединение с БД не хочу закрывать, то тогда туда что пихать?

Oleg
28.07.2016
13:46:45
куда туда?

Dmitry
28.07.2016
13:46:48
только убитие Statement ?

в finalize()

Oleg
28.07.2016
13:47:12
всмысле не хочешь?) а как ты его потом сможешь использовать?

Dmitry
28.07.2016
13:47:20
а вот я не знаю

Oleg
28.07.2016
13:47:31
в этом плане finalize это последнее, что будет вызвано

практически ты можешь нагородить как хочешь

несколько раз вызывать finalize

Dmitry
28.07.2016
13:47:57
ты просто сказал, что операция открытия соединения дорогая и я думал как не закрывать его

Страница 43 из 719