Здравствуйте, AlexeyStaf, Вы писали:
AS>Есть какой-то класс. В конструкторе этого класса я пытаюсь соединиться с БД. Если соединение с БД не установлено, то дальнейшая работа класса невозможна. Поэтому: как мне при создании экземпляра класса вернуть NULL? Я так понял, что придется кидать исключение, но тогда его придется отлавлявать в основной программе при создании объекта. Есть ли какой-то другой вариант решения этого?
Раз в задаче конкретно указан NULL, значит решение чисто кодовое
и я не буду рассматривать возможные проектные решения для описанной
ситуации.
NULL может относиться только к динамическим объектам.
Следовательно, нужно переопределить operator new
А>Выкидывать исключения в конструкторе можно, но о возможных последствиях думать все равно надо.
Если ты будешь писать в таком стиле, то утечки у тебя будут независимо от того кидаешь ты исключения в конструкторе или нет. Достаточно взглянуть на такой пример:
...к сожалению для нелюбителей исключений сам язык сейчас кидает исключения достаточно часто. Поэтому от того, кидает пользователь исключения или нет, уже мало что зависит...
Андрей Тарасевич wrote:
> AS>Есть какой-то класс. В конструкторе этого класса я пытаюсь > соединиться с БД. Если соединение с БД не установлено, то дальнейшая > работа класса невозможна. Поэтому: как мне при создании экземпляра > класса вернуть NULL? Я так понял, что придется кидать исключение, но > тогда его придется отлавлявать в основной программе при создании > объекта. Есть ли какой-то другой вариант решения этого? > > "Вернуть" из конструктора ничего нельзя.
Здравствуйте, ois, Вы писали:
AS>>Есть какой-то класс. В конструкторе этого класса я пытаюсь соединиться с БД. Если соединение с БД не установлено, то дальнейшая работа класса невозможна. Поэтому: как мне при создании экземпляра класса вернуть NULL? Я так понял, что придется кидать исключение, но тогда его придется отлавлявать в основной программе при создании объекта. Есть ли какой-то другой вариант решения этого?
ois>Раз в задаче конкретно указан NULL, значит решение чисто кодовое ois>и я не буду рассматривать возможные проектные решения для описанной ois>ситуации. ois>NULL может относиться только к динамическим объектам. ois>Следовательно, нужно переопределить operator new
Конструктор начинает выполняться строго после того, как отработал operator new. Чтобы вернуть NULL в случае, когда инициализация объекта невозможна, operator new должен обладать даром ясновидения.
Здравствуйте, Centaur, Вы писали:
C>Здравствуйте, ois, Вы писали:
C>Конструктор начинает выполняться строго после того, как отработал operator new. Чтобы вернуть NULL в случае, когда инициализация объекта невозможна, operator new должен обладать даром ясновидения.
Если конструктор не имеет параметров или эти параметры не
нужны для соединения с БД, то ясновидения не нужно.
Впрочен, согласен, что моя идея плоха. Я просто старался
следовать условию задачи
А>>Выкидывать исключения в конструкторе можно, но о возможных последствиях думать все равно надо.
R>Если ты будешь писать в таком стиле, то утечки у тебя будут независимо от того кидаешь ты исключения в конструкторе или нет. Достаточно взглянуть на такой пример:
R>
R>...к сожалению для нелюбителей исключений сам язык сейчас кидает исключения достаточно часто. Поэтому от того, кидает пользователь исключения или нет, уже мало что зависит...
А поясните, пожалуйста, где будут утечки в последнем приведенном примере?
> R>...к сожалению для нелюбителей исключений сам язык сейчас кидает > исключения достаточно часто. Поэтому от того, кидает пользователь > исключения или нет, уже мало что зависит...
> А поясните, пожалуйста, где будут утечки в последнем приведенном примере?
Если второй new выбросит исключение, то деструктор не вызовется и не удалит память, выделенную в первом new
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
>> R>...к сожалению для нелюбителей исключений сам язык сейчас кидает >> исключения достаточно часто. Поэтому от того, кидает пользователь >> исключения или нет, уже мало что зависит...
>> А поясните, пожалуйста, где будут утечки в последнем приведенном примере? _>Если второй new выбросит исключение, то деструктор не вызовется и не удалит память, выделенную в первом new
Насколько велика вероятность, что new int[100] кинет исключение (именно вот такой небольшой запрашиваемый кусочек памяти)?
Был бы благодарен, если бы увидел пример, как правильно делать в этом случае (без использования буста, пожалйуста).
Rothmans wrote:
>> > R>...к сожалению для нелюбителей исключений сам язык сейчас кидает >> > исключения достаточно часто. Поэтому от того, кидает пользователь >> > исключения или нет, уже мало что зависит... > >> > А поясните, пожалуйста, где будут утечки в последнем приведенном примере? > _>Если второй new выбросит исключение, то деструктор не вызовется и не > удалит память, выделенную в первом new > > Насколько велика вероятность, что new int[100] кинет исключение (именно
Нельзя быть чуточку беременным.
Утечка либо возможна, либо нет. Ничто не мешает писать код без возможных утечек (кроме неопытности).
> вот такой небольшой запрашиваемый кусочек памяти)?
А насколько велика вероятность, что ты будешь запрашивать именно 100? А не заданный переданным параметром размер?
> Был бы благодарен, если бы увидел пример, как правильно делать в этом > случае (без использования буста, пожалйуста).
Здравствуйте, kan_izh, Вы писали:
_>Rothmans wrote:
>>> > R>...к сожалению для нелюбителей исключений сам язык сейчас кидает >>> > исключения достаточно часто. Поэтому от того, кидает пользователь >>> > исключения или нет, уже мало что зависит... >> >>> > А поясните, пожалуйста, где будут утечки в последнем приведенном примере? >> _>Если второй new выбросит исключение, то деструктор не вызовется и не >> удалит память, выделенную в первом new >> >> Насколько велика вероятность, что new int[100] кинет исключение (именно _>Нельзя быть чуточку беременным. _>Утечка либо возможна, либо нет. Ничто не мешает писать код без возможных утечек (кроме неопытности).
с таким подходом ловить исключения придется параноически везде (int a = 2+2; и то может кинуть исключение, если вся память вообще закончилась или процессор перегрелся )
>> вот такой небольшой запрашиваемый кусочек памяти)? _>А насколько велика вероятность, что ты будешь запрашивать именно 100? А не заданный переданным параметром размер?
если нужен массив в 100 целых, то вероятность, что потребуется что-то еще на данный момент 0. Правда тогда new становится не нужен и память можно выделять статически
Но я по сути не спорю. >> Был бы благодарен, если бы увидел пример, как правильно делать в этом >> случае (без использования буста, пожалйуста).
_>struct MyCoolClass _>{ _> std::vector m_p1, m_p2; _> MyCoolClass::MyCoolClass() _> { _> m_p1.resize(100); _> m_p2.resize(100); _> } _>}
Rothmans wrote:
> с таким подходом ловить исключения придется параноически везде (int a = > 2+2; и то может кинуть исключение, если вся память вообще закончилась > или процессор перегрелся )
Не может. Спецификация языка не предусматривает cpu_overheat_exception.
А память под "a" выделяется на стеке при входе в функцию, так что если это был последний байт, ничего страшного, память
уже есть выделенная, осталось сложить два числа и поместить в эту память.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, kan_izh, Вы писали:
_>Rothmans wrote:
>> с таким подходом ловить исключения придется параноически везде (int a = >> 2+2; и то может кинуть исключение, если вся память вообще закончилась >> или процессор перегрелся ) _>Не может. Спецификация языка не предусматривает cpu_overheat_exception. _>А память под "a" выделяется на стеке при входе в функцию, так что если это был последний байт, ничего страшного, память _>уже есть выделенная, осталось сложить два числа и поместить в эту память.
так и думал, что ты так парируешь
это я не смог придумать адекватный пример и написал чисто метафорически.