shared_ptr с вызовом фабричного метода
От: gencoder  
Дата: 13.01.17 12:51
Оценка:
Правильно ли я понимаю, что утечек памяти в блоке A нет?
  // ...
  { // начало блока A
    vector<std::shared_ptr<Base>> v;
    v.push_back(std::shared_ptr<Base>(Base::create(23)));
    v.push_back(std::shared_ptr<Base>(Base::create(25)));
    v.push_back(std::shared_ptr<Base>(Base::create(33)));
    for( auto e: v ) e->foo();
  } // конец блока A
  //...
  enum ID { SomeID1=23 /* ... */ };
  Base* Base::create( ID id )
  {
      Base * p;
      switch( id )
      {
          case SomeId1: p = new /* ... */ break;
          // ...
      }
      return p;
  }
Отредактировано 13.01.2017 12:52 gencoder . Предыдущая версия .
shared_ptr
Re: shared_ptr с вызовом фабричного метода
От: uzhas Ниоткуда  
Дата: 13.01.17 13:00
Оценка: 1 (1) +2
Здравствуйте, gencoder, Вы писали:

G>Правильно ли я понимаю, что утечек памяти в блоке A нет?

если у Base есть виртуальный деструктор, то проблем не вижу

рекомендую из функций возвращать смарт-пойнтеры, а не сырые указатели
Отредактировано 13.01.2017 14:57 uzhas . Предыдущая версия .
Re[2]: shared_ptr с вызовом фабричного метода
От: MasterZiv СССР  
Дата: 13.01.17 13:22
Оценка:
Здравствуйте, uzhas, Вы писали:

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


G>>Правильно ли я понимаю, что утечек памяти в блоке A нет?

U>если у Base есть виртуальный деструктор, то проблем не вижу

U>рекомендую из функций возвращать смарт-порйнтеры, а не сырые указатели


А shared-ы создавать через make_shared()
Re[3]: shared_ptr с вызовом фабричного метода
От: Alexander G Украина  
Дата: 13.01.17 13:40
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>А shared-ы создавать через make_shared()


И вообще, часто достаточно vector<unique_ptr<T>> — в этих случаях vector<shared_ptr<T>> использовали, когда unique_ptr не было.
Русский военный корабль идёт ко дну!
Re[3]: shared_ptr с вызовом фабричного метода
От: gencoder  
Дата: 13.01.17 15:07
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>А shared-ы создавать через make_shared()


так вроде здесь, даже если в Base::create сработает исключение, проблем не должно быть:
std::shared_ptr<Base> Base::create( ID id ){
  std::shared_ptr<Base> ptr;
  case SomeID123:
     p = std::shared_ptr<SomeClass1>(new SomeClass123);
  break;
  // ...
  return ptr;
};
// ..
v.push_back(Base::create(123));
Re[4]: shared_ptr с вызовом фабричного метода
От: uzhas Ниоткуда  
Дата: 13.01.17 15:41
Оценка:
Здравствуйте, gencoder, Вы писали:

G>так вроде здесь, даже если в Base::create сработает исключение, проблем не должно быть:


чаще всего make_shared используют для оптимизации аллокации, чтобы по факту произошла одна хитрая аллокация, и рядом с объектом хранился счетчик
в коде
std::shared_ptr<SomeClass1>(new SomeClass123);

выполняется две аллокации : одна для объекта, вторая для счетчика
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.