Re[4]: Вернуть NULL в конструкторе
От: av Россия  
Дата: 03.04.06 07:07
Оценка:
А>Если не пользоваться умными указателями или специально не озаботиться решением этой проблемы,
А>то утечки будут

А почему бы ими не пользоваться? Чем в данном случае int* m_p лучше, чем std::vector<int>?
Re: Вернуть NULL в конструкторе
От: ois  
Дата: 03.04.06 14:07
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

AS>Есть какой-то класс. В конструкторе этого класса я пытаюсь соединиться с БД. Если соединение с БД не установлено, то дальнейшая работа класса невозможна. Поэтому: как мне при создании экземпляра класса вернуть NULL? Я так понял, что придется кидать исключение, но тогда его придется отлавлявать в основной программе при создании объекта. Есть ли какой-то другой вариант решения этого?


Раз в задаче конкретно указан NULL, значит решение чисто кодовое
и я не буду рассматривать возможные проектные решения для описанной
ситуации.
NULL может относиться только к динамическим объектам.
Следовательно, нужно переопределить operator new
Re[4]: Вернуть NULL в конструкторе
От: remark Россия http://www.1024cores.net/
Дата: 03.04.06 17:25
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Ну и что?

А>Если не пользоваться умными указателями или специально не озаботиться решением этой проблемы,
А>то утечки будут
А>
А>struct MyCoolClass
А>{
А>  MyCoolClass::MyCoolClass()
А>  {
А>    m_p = new int[100];
А>    throw 1;
А>  }
А>  MyCoolClass::~MyCoolClass()
А>  {
А>    delete m_p;
А>  }
А>}
А>


А>Выкидывать исключения в конструкторе можно, но о возможных последствиях думать все равно надо.



Если ты будешь писать в таком стиле, то утечки у тебя будут независимо от того кидаешь ты исключения в конструкторе или нет. Достаточно взглянуть на такой пример:

struct MyCoolClass
{
  MyCoolClass::MyCoolClass()
  {
    m_p1 = new int[100];
    m_p2 = new int[100];
  }
  MyCoolClass::~MyCoolClass()
  {
    delete[] m_p1;
    delete[] m_p2;
  }
}



...к сожалению для нелюбителей исключений сам язык сейчас кидает исключения достаточно часто. Поэтому от того, кидает пользователь исключения или нет, уже мало что зависит...


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Вернуть NULL в конструкторе
От: MaximE Великобритания  
Дата: 03.04.06 19:08
Оценка:
Андрей Тарасевич wrote:

> AS>Есть какой-то класс. В конструкторе этого класса я пытаюсь

> соединиться с БД. Если соединение с БД не установлено, то дальнейшая
> работа класса невозможна. Поэтому: как мне при создании экземпляра
> класса вернуть NULL? Я так понял, что придется кидать исключение, но
> тогда его придется отлавлявать в основной программе при создании
> объекта. Есть ли какой-то другой вариант решения этого?
>
> "Вернуть" из конструктора ничего нельзя.

Технически вернуть из конструктора — элементарно.

struct some {
     some(bool* ok)
     {
         *ok = false;
         // initialization
         *ok = true;
     }
};

void f()
{
     bool ok;
     some s(&ok);
     if(!ok)
     {
         // ...
     }
}


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

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 2.0
Re[2]: Вернуть NULL в конструкторе
От: Centaur Россия  
Дата: 04.04.06 09:25
Оценка:
Здравствуйте, ois, Вы писали:

AS>>Есть какой-то класс. В конструкторе этого класса я пытаюсь соединиться с БД. Если соединение с БД не установлено, то дальнейшая работа класса невозможна. Поэтому: как мне при создании экземпляра класса вернуть NULL? Я так понял, что придется кидать исключение, но тогда его придется отлавлявать в основной программе при создании объекта. Есть ли какой-то другой вариант решения этого?


ois>Раз в задаче конкретно указан NULL, значит решение чисто кодовое

ois>и я не буду рассматривать возможные проектные решения для описанной
ois>ситуации.
ois>NULL может относиться только к динамическим объектам.
ois>Следовательно, нужно переопределить operator new

Конструктор начинает выполняться строго после того, как отработал operator new. Чтобы вернуть NULL в случае, когда инициализация объекта невозможна, operator new должен обладать даром ясновидения.
Re[3]: Вернуть NULL в конструкторе
От: ois  
Дата: 04.04.06 09:59
Оценка:
Здравствуйте, Centaur, Вы писали:

C>Здравствуйте, ois, Вы писали:


C>Конструктор начинает выполняться строго после того, как отработал operator new. Чтобы вернуть NULL в случае, когда инициализация объекта невозможна, operator new должен обладать даром ясновидения.


Если конструктор не имеет параметров или эти параметры не
нужны для соединения с БД, то ясновидения не нужно.
Впрочен, согласен, что моя идея плоха. Я просто старался
следовать условию задачи
Re[5]: Вернуть NULL в конструкторе
От: Rothmans  
Дата: 04.04.06 16:18
Оценка:
Здравствуйте, remark, Вы писали:

R>Здравствуйте, Аноним, Вы писали:



А>>Ну и что?

А>>Если не пользоваться умными указателями или специально не озаботиться решением этой проблемы,
А>>то утечки будут
А>>
А>>struct MyCoolClass
А>>{
А>>  MyCoolClass::MyCoolClass()
А>>  {
А>>    m_p = new int[100];
А>>    throw 1;
А>>  }
А>>  MyCoolClass::~MyCoolClass()
А>>  {
А>>    delete m_p;
А>>  }
А>>}
А>>


А>>Выкидывать исключения в конструкторе можно, но о возможных последствиях думать все равно надо.



R>Если ты будешь писать в таком стиле, то утечки у тебя будут независимо от того кидаешь ты исключения в конструкторе или нет. Достаточно взглянуть на такой пример:


R>
R>struct MyCoolClass
R>{
R>  MyCoolClass::MyCoolClass()
R>  {
R>    m_p1 = new int[100];
R>    m_p2 = new int[100];
R>  }
R>  MyCoolClass::~MyCoolClass()
R>  {
R>    delete[] m_p1;
R>    delete[] m_p2;
R>  }
R>}
R>



R>...к сожалению для нелюбителей исключений сам язык сейчас кидает исключения достаточно часто. Поэтому от того, кидает пользователь исключения или нет, уже мало что зависит...


А поясните, пожалуйста, где будут утечки в последнем приведенном примере?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Вернуть NULL в конструкторе
От: kan_izh Великобритания  
Дата: 04.04.06 16:32
Оценка:
Rothmans wrote:
> R>struct MyCoolClass
> R>{
> R>  MyCoolClass::MyCoolClass()
> R>  {
> R>    m_p1 = new int[100];
> R>    m_p2 = new int[100];
> R>  }
> R>  MyCoolClass::~MyCoolClass()
> R>  {
> R>    delete[] m_p1;
> R>    delete[] m_p2;
> R>  }
> R>}
> R>


> R>...к сожалению для нелюбителей исключений сам язык сейчас кидает

> исключения достаточно часто. Поэтому от того, кидает пользователь
> исключения или нет, уже мало что зависит...

> А поясните, пожалуйста, где будут утечки в последнем приведенном примере?

Если второй new выбросит исключение, то деструктор не вызовется и не удалит память, выделенную в первом new
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[7]: Вернуть NULL в конструкторе
От: Rothmans  
Дата: 04.04.06 22:15
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>Rothmans wrote:

_>
>> R>struct MyCoolClass
>> R>{
>> R>  MyCoolClass::MyCoolClass()
>> R>  {
>> R>    m_p1 = new int[100];
>> R>    m_p2 = new int[100];
>> R>  }
>> R>  MyCoolClass::~MyCoolClass()
>> R>  {
>> R>    delete[] m_p1;
>> R>    delete[] m_p2;
>> R>  }
>> R>}
>> R>
_>


>> R>...к сожалению для нелюбителей исключений сам язык сейчас кидает

>> исключения достаточно часто. Поэтому от того, кидает пользователь
>> исключения или нет, уже мало что зависит...

>> А поясните, пожалуйста, где будут утечки в последнем приведенном примере?

_>Если второй new выбросит исключение, то деструктор не вызовется и не удалит память, выделенную в первом new

Насколько велика вероятность, что new int[100] кинет исключение (именно вот такой небольшой запрашиваемый кусочек памяти)?
Был бы благодарен, если бы увидел пример, как правильно делать в этом случае (без использования буста, пожалйуста).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[8]: Вернуть NULL в конструкторе
От: kan_izh Великобритания  
Дата: 04.04.06 22:28
Оценка: 1 (1)
Rothmans wrote:

>> > R>...к сожалению для нелюбителей исключений сам язык сейчас кидает

>> > исключения достаточно часто. Поэтому от того, кидает пользователь
>> > исключения или нет, уже мало что зависит...
>
>> > А поясните, пожалуйста, где будут утечки в последнем приведенном примере?
> _>Если второй new выбросит исключение, то деструктор не вызовется и не
> удалит память, выделенную в первом new
>
> Насколько велика вероятность, что new int[100] кинет исключение (именно
Нельзя быть чуточку беременным.
Утечка либо возможна, либо нет. Ничто не мешает писать код без возможных утечек (кроме неопытности).

> вот такой небольшой запрашиваемый кусочек памяти)?

А насколько велика вероятность, что ты будешь запрашивать именно 100? А не заданный переданным параметром размер?

> Был бы благодарен, если бы увидел пример, как правильно делать в этом

> случае (без использования буста, пожалйуста).

struct MyCoolClass
{
std::vector m_p1, m_p2;
MyCoolClass::MyCoolClass()
{
m_p1.resize(100);
m_p2.resize(100);
}
}
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Вернуть NULL в конструкторе
От: strcpy Россия  
Дата: 05.04.06 05:00
Оценка:
J>Если не секрет, чем не угодили исключения?
они не на всех компиляторах есть.
Удвой число ошибок, если не получается добиться цели.
Re[9]: Вернуть NULL в конструкторе
От: Rothmans  
Дата: 05.04.06 06:22
Оценка:
Здравствуйте, 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);
_> }
_>}

Ясно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Вернуть NULL в конструкторе
От: kan_izh Великобритания  
Дата: 05.04.06 08:48
Оценка:
Rothmans wrote:

> с таким подходом ловить исключения придется параноически везде (int a =

> 2+2; и то может кинуть исключение, если вся память вообще закончилась
> или процессор перегрелся )
Не может. Спецификация языка не предусматривает cpu_overheat_exception.
А память под "a" выделяется на стеке при входе в функцию, так что если это был последний байт, ничего страшного, память
уже есть выделенная, осталось сложить два числа и поместить в эту память.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[11]: Вернуть NULL в конструкторе
От: Rothmans  
Дата: 05.04.06 08:59
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>Rothmans wrote:


>> с таким подходом ловить исключения придется параноически везде (int a =

>> 2+2; и то может кинуть исключение, если вся память вообще закончилась
>> или процессор перегрелся )
_>Не может. Спецификация языка не предусматривает cpu_overheat_exception.
_>А память под "a" выделяется на стеке при входе в функцию, так что если это был последний байт, ничего страшного, память
_>уже есть выделенная, осталось сложить два числа и поместить в эту память.

так и думал, что ты так парируешь
это я не смог придумать адекватный пример и написал чисто метафорически.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Вернуть NULL в конструкторе
От: Angler Россия  
Дата: 02.05.06 12:02
Оценка:
Здравствуйте, strcpy, Вы писали:

J>>Если не секрет, чем не угодили исключения?

S>они не на всех компиляторах есть.

6 лет назад возможно это было бы аргументом...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.