Re: Вернуть NULL в конструкторе
От: Stuw  
Дата: 28.03.06 06:36
Оценка: -3
Здравствуйте, AlexeyStaf, Вы писали:

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


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

Второе: как вариант сделать статическю функцию а Вашего класса, которая будет создавать объект соединения и возвращать указатель на него. Если соединение не создастся, то она легко может вернуть NULL.
Re: Вернуть NULL в конструкторе
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 27.03.06 09:08
Оценка: 2 (1)
Здравствуйте, AlexeyStaf, Вы писали:

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


можно возложить обязанность по созданию экземпляра этого класса на отдельный класс, возвращающий указатель на внось созданный объект и NULL в случае неудачи — см. паттерн builder
"Что не завершено, не сделано вовсе" Гаусс
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: Вернуть NULL в конструкторе
От: Bell Россия  
Дата: 27.03.06 08:38
Оценка: +1
Здравствуйте, AlexeyStaf, Вы писали:

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

Да.

AS>Есть ли какой-то другой вариант решения этого?

Отложенная инициализация:
SomeClass obj;
if(!obj.Init())
   return false;
Любите книгу — источник знаний (с) М.Горький
Re: Вернуть NULL в конструкторе
От: remark Россия http://www.1024cores.net/
Дата: 27.03.06 16:53
Оценка: :)
Здравствуйте, AlexeyStaf, Вы писали:

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



Не использовать объекты



1024cores — all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[2]: Вернуть NULL в конструкторе
От: _DAle_ Беларусь  
Дата: 28.03.06 09:00
Оценка: +1
Здравствуйте, Stuw, Вы писали:

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


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


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


15.2/2
An object that is partially constructed or partially destroyed will have destructors executed for all of its fully constructed subobjects, that is, for subobjects for which the constructor has completed execution and the destructor has not yet begun execution.

... << RSDN@Home 1.1.4 beta 7 rev. 447>>
Re[3]: Вернуть NULL в конструкторе
От: _Winnie Россия C++.freerun
Дата: 28.03.06 10:28
Оценка: +1
Здравствуйте, Centaur, Вы писали:

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


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


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


C>Лучше так:



Если то, что объект не может создаться — нормальное поведение программы, то исключения не стоит использовать ни с какой точки зрения.
Ни с точки зрения эффективности, ни с точки зрения удобства (в данном случае, правда, синтаксический оверхед примерно одинаковый, если не извращаться с operator?: ), ни с точки зрения "фелософии праэктирования".

C>
C>MyClass *Create(какие-то параметры)
C>{
C>  try
C>  {
C>    MyClass* p = new MyClass(какие-то параметры);
C>    return p;
C>  }
C>  catch (const MyClassDBException&)
C>  {
C>    return 0;
C>  }
C>}
C>
Правильно работающая программа — просто частный случай Undefined Behavior
Re[3]: Вернуть NULL в конструкторе
От: Аноним  
Дата: 28.03.06 14:34
Оценка: -1
Здравствуйте, _DAle_, Вы писали:

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


_DA>

15.2/2
_DA>An object that is partially constructed or partially destroyed will have destructors executed for all of its fully constructed subobjects, that is, for subobjects for which the constructor has completed execution and the destructor has not yet begun execution.


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


Выкидывать исключения в конструкторе можно, но о возможных последствиях думать все равно надо.
Вернуть NULL в конструкторе
От: AlexeyStaf Россия  
Дата: 27.03.06 08:35
Оценка:
Есть какой-то класс. В конструкторе этого класса я пытаюсь соединиться с БД. Если соединение с БД не установлено, то дальнейшая работа класса невозможна. Поэтому: как мне при создании экземпляра класса вернуть NULL? Я так понял, что придется кидать исключение, но тогда его придется отлавлявать в основной программе при создании объекта. Есть ли какой-то другой вариант решения этого?
... << RSDN@Home 1.1.4 stable rev. 510>>
-----
С уважением, Алексей.
Re[2]: Вернуть NULL в конструкторе
От: AlexeyStaf Россия  
Дата: 27.03.06 08:51
Оценка:
Здравствуйте, Bell, Вы писали:

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


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

B>Да.

AS>>Есть ли какой-то другой вариант решения этого?

B>Отложенная инициализация:
B>
B>SomeClass obj;
B>if(!obj.Init())
B>   return false;
B>


Про отложенную инициализацию уже подумал. Просто думал, что есть какое-то нормальное решение (кроме исключений и отложенной инициализации).
... << RSDN@Home 1.1.4 stable rev. 510>>
-----
С уважением, Алексей.
Re: Вернуть NULL в конструкторе
От: Left2 Украина  
Дата: 27.03.06 09:08
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

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


сделай статический метод класса (к примеру, New()) в котором будешь создавать обьект, ловить исключения и возвращать NULL в случае неудачи. Или не статический а просто функцию. Или целую фабрику.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Вернуть NULL в конструкторе
От: gear nuke  
Дата: 27.03.06 09:34
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

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


Не совсем при создании:
struct My
{
    My() { initialized_ =  init(); }
    operator bool() const { return initialized_; }
    
  private:
    bool init();
    bool initialized_;
};

My obj;
if ( ! obj ) ...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re: Вернуть NULL в конструкторе
От: _Winnie Россия C++.freerun
Дата: 27.03.06 09:47
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

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





MyClass *Create(какие-то параметры)
{
   void *p = new MyClass(какие-то параметры);
   if (!p->IsOk())
   {
      delete p;
      return NULL;
   }
   else 
      return p;
  //для извращенцев - 
  return p->IsOk() ? (delete p, NULL) : p;
}
Правильно работающая программа — просто частный случай Undefined Behavior
Re[2]: Вернуть NULL в конструкторе
От: Centaur Россия  
Дата: 27.03.06 15:49
Оценка:
Здравствуйте, _Winnie, Вы писали:

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


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


Лучше так:

MyClass *Create(какие-то параметры)
{
  try
  {
    MyClass* p = new MyClass(какие-то параметры);
    return p;
  }
  catch (const MyClassDBException&)
  {
    return 0;
  }
}
Re: Вернуть NULL в конструкторе
От: Андрей Тарасевич Беларусь  
Дата: 27.03.06 17:00
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

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


"Вернуть" из конструктора ничего нельзя. А уж как это сделать по-другому — есть масса разных способов. Можно кидать исключение. Можно потом, как уже посоветовали, завернуть поимку исключения внутрь метода-фабрики, чтобы не заниматься ловлей в клиентском коде. Можно просто в процессе конструкции выставлять флаг "сконструированности": получилось/не получилось и обрабатывать его позже. Можно опять же сделать метод-фабрику, в котром все потенциально неудачные действия делаются и проверяются еще до вызова конструктора, а сам конструктор уже работает "гарантированно". И т.д.
Best regards,
Андрей Тарасевич
Re: Вернуть NULL в конструкторе
От: LaptevVV Россия  
Дата: 27.03.06 17:05
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

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

Идиома виртуального конструктора — типа метод Create///
Идиома пустого объекта... Возвращай не нулевой указатель, а пустой объект базы....
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[4]: Вернуть NULL в конструкторе
От: _Winnie Россия C++.freerun
Дата: 28.03.06 10:31
Оценка:
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, Centaur, Вы писали:

C>>Лучше так:

_W>

_W> ни с точки зрения "фелософии праэктирования".


Правда, только в том случае, если при написании класса MyClass мы знаем, как он будет создаваться в Create. Но судя по тому, что автор топика хочет "вернуть NULL из конструктора", в данном случае MyClass знает, что его ошибка создания — нормальная ситуация.
Правильно работающая программа — просто частный случай Undefined Behavior
Re: Вернуть NULL в конструкторе
От: jazzer Россия Skype: enerjazzer
Дата: 28.03.06 13:36
Оценка:
Здравствуйте, AlexeyStaf, Вы писали:

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


Если не секрет, чем не угодили исключения?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Вернуть NULL в конструкторе
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 28.03.06 15:02
Оценка:
Здравствуйте, Stuw, Вы писали:

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


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


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


S>Второе: как вариант сделать статическю функцию а Вашего класса, которая будет создавать объект соединения и возвращать указатель на него. Если соединение не создастся, то она легко может вернуть NULL.


если произошло исключение в конструкторе, то объект считается не сконструированным и соответственно не будет вызван деструктор этого объекта, т.к. уничтожать в принципе нечего.. а вот для созданных до исключения членов деструкторы вызваны будут
"Что не завершено, не сделано вовсе" Гаусс
Re[2]: Вернуть NULL в конструкторе
От: AlexeyStaf Россия  
Дата: 29.03.06 05:46
Оценка:
Здравствуйте, jazzer, Вы писали:

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


Всем угодили
http://rsdn.ru/Forum/Message.aspx?mid=1805478&amp;only=1
Автор: AlexeyStaf
Дата: 27.03.06
... << RSDN@Home 1.1.4 stable rev. 510>>
-----
С уважением, Алексей.
Re[2]: Вернуть NULL в конструкторе
От: _Winnie Россия C++.freerun
Дата: 29.03.06 10:25
Оценка:
Здравствуйте, _Winnie, Вы писали:
_W>Здравствуйте, AlexeyStaf, Вы писали:

_W>
_W>MyClass *Create(какие-то параметры)
_W>{
_W>   void *p = new MyClass(какие-то параметры);
_W>


Посмотрел на этот код, увидел дурацкую опечату. Конечно, не void, а MyClass =)
Правильно работающая программа — просто частный случай Undefined Behavior
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[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...
Пока на собственное сообщение не было ответов, его можно удалить.