Правильно ли я понимаю, что утечек памяти в блоке 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;
}
Здравствуйте, gencoder, Вы писали:
G>Правильно ли я понимаю, что утечек памяти в блоке A нет?
если у Base есть виртуальный деструктор, то проблем не вижу
рекомендую из функций возвращать смарт-пойнтеры, а не сырые указатели
Здравствуйте, uzhas, Вы писали:
U>Здравствуйте, gencoder, Вы писали:
G>>Правильно ли я понимаю, что утечек памяти в блоке A нет? U>если у Base есть виртуальный деструктор, то проблем не вижу
U>рекомендую из функций возвращать смарт-порйнтеры, а не сырые указатели
Здравствуйте, gencoder, Вы писали:
G>так вроде здесь, даже если в Base::create сработает исключение, проблем не должно быть:
чаще всего make_shared используют для оптимизации аллокации, чтобы по факту произошла одна хитрая аллокация, и рядом с объектом хранился счетчик
в коде
std::shared_ptr<SomeClass1>(new SomeClass123);
выполняется две аллокации : одна для объекта, вторая для счетчика