Безопасно ли push_back «динамически выделяемый объект» в вектор?

Каждый раз, когда мне нужно добавить динамически выделенный объект в вектор, я делал это следующим образом:

class Foo { ... };

vector<Foo*> v;

v.push_back(new Foo);

// do stuff with Foo in v

// delete all Foo in v

Это просто сработало, и многие другие, похоже, делают то же самое вещь.

Сегодня я узнал, что vector :: push_back может вызывать исключение. Это означает, что приведенный выше код не безопасен в отношении исключений. :-( Итак, я нашел решение:

class Foo { ... };

vector<Foo*> v;
auto_ptr<Foo> p(new Foo);

v.push_back(p.get());
p.release();

// do stuff with Foo in v

// delete all Foo in v

Но проблема в том, что новый способ многословен, утомителен, и я вижу, что никто его не делает. (По крайней мере, не рядом со мной ...)

Я должен пойти по-новому?
Или я могу просто придерживаться старого способа?
Или есть лучший способ сделать это?

6
задан upriser 15 November 2010 в 14:37
поделиться