
Oleg
28.07.2016
13:16:40
более правильное
в деструкторе можешь close() написать

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

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. в деструкторе удалил что-то

Oleg
28.07.2016
13:30:33

Макс
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

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

Макс
28.07.2016
13:32:43

qwe
28.07.2016
13:32:50

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

Oleg
28.07.2016
13:36:33
порядок удаления по умолчанию немного неудобный
сначала вызывается деструктор объемлющего класса, потом его полей

Google

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

Oleg
28.07.2016
13:37:24
деструктор сам ничего не удаляет
деструктор это функция, которая вызывается при удалении
всю деинициализацию запихивал в деструкторы
а при завершении программы он уже выгружал библиотеку
и из деструктора вызовы к opengl приводили к аказии
поэтому, чтобы правильно высвободить некоторые объекты, нужно быть уверенным в том, что необходимые драйвера/библиотеки/объекты не выгружены/удалены и тд

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

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

Admin
ERROR: S client not available

Oleg
28.07.2016
13:40:15

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
ты просто сказал, что операция открытия соединения дорогая и я думал как не закрывать его