Минималистичные деструкторы? - PullRequest
2 голосов
/ 22 ноября 2010

У нас есть проблемы с моим другом.Предположим, у нас есть класс, который реализует соединение с базой данных, например:

class DB
{
void Connect();
void Disconnect();
// ...
~DB();
};

На мой взгляд, деструктор должен быть минималистичным, что означает, что деструктор не должен вызывать метод Disconnect при установлении соединения.Я думаю, что это должно быть сделано отдельным методом (disnect () в этом примере).Я прав, или мой друг?

PS.Сообщество Wiki?

Ответы [ 4 ]

8 голосов
/ 22 ноября 2010

Вашего деструктора должно быть достаточно, чтобы очистить все ресурсы, которые были получены за время существования объекта.Это может включать или не включать конечные соединения.В противном случае, кто будет выполнять очистку, если возникнет исключение?

2 голосов
/ 22 ноября 2010

Идиомы RAII гласят: получить в конструкторе и освободить в деконструкторе.Вы должны гарантировать, что ваш деконструктор НЕ будет выбрасывать что-либо.В противном случае у вас будет дамп ядра (или неопределенное поведение), если деконструктор вашего объекта вызовет исключение во время размотки стека.

Также в вашем конкретном случае я, вероятно, реализую механизм подсчета ссылок и вызову отключение простокогда у вас больше нет объекта, использующего соединение.

2 голосов
/ 22 ноября 2010

В соответствии с синтаксисом это выглядит как C ++.Я прав?Потому что, если это так, вы можете (и настоятельно рекомендуется) использовать идиому RAII.Это означает, что вы получаете соединение с БД на этапе строительства, освобождаете его (отключаете) при уничтожении.

Полезная ссылка: Что такое RAII All About?

0 голосов
/ 22 ноября 2010

С точки зрения пользователя класса, я считаю, что лучше попробовать и disconnect соединение с базой данных, когда оно должно вместо того, чтобы предполагать, что деструктор выполнит свою работу.

Однако случаются плохие вещи, особенно исключения, и вы должны гарантировать, что очистка произойдет независимо от того, что произошло. Вот почему ваш деструктор, тем не менее, должен disconnect, если это необходимо (т. Е. Если он не был явно вызван пользователем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...