2011-12-17 3 views
0

В приложении C++ я создаю в разных точках класса Пользовательские объекты определенного класса Vehicle с оператором new и right после каждого экземпляра я помещаю их в вектор, который является свойством первого класса (т. Е. vector< Vehicle* > v1).Удалить объекты, переносимые в вектор?

  1. При запуске программы, скорее всего, мне нужно указать пункт, чтобы удалить объекты класса Vehicle. Должен ли я определенно удалить оператор? Если да, то как это сделать с вектором? Есть ли какая-либо предопределенная функция вектора для выполнения той же работы? Когда я удалю их, что происходит со свойствами класса Vehicle, которые по этому поводу являются указателями на другие объекты? Они также удалены?

  2. Если нет необходимости удалять их до конца программы, они удаляются деструктором или должны удалять их «вручную»?

+0

Никогда не используйте 'delete'. Никогда не используйте «указатели». Используйте «new» только в конструкторе умного указателя. –

+0

@Kerrek: «Никогда не использовать указатели» неверно. * Никогда не используйте **, владея исходными указателями ***, будет более правильным. – Xeo

+0

@Xeo: По-видимому, необработанный указатель не может действительно «владеть» самостоятельно - его собственность не является локальной, внешней информацией. –

ответ

2

Вот C++ способ:

#include <memory> 
#include <vector> 

#include "vehicle.hpp" 
typedef std::vector<std::unique_ptr<Vehicle>> vehicle_container; 

#include "derivedvehicles.hpp" 

int main() 
{ 
    vehicle_container v; 
    //... 
    v.emplace_back(new Car); 
    v.emplace_back(new Bike); 
    //... 
} // baam, everything is cleaned up 
+0

«Магия», конечно, будучи unique_ptr (nee «auto_ptr», иначе «умный указатель»). – paulsm4

+0

Так что в принципе рекомендуется использовать 'emplace_back' все время (если только вам не нужен объект, для которого вы добавляете копию) вместо' push_back'? –

+0

Обратите внимание, что 'unique_ptr' требует компилятора C++ 11 – bdonlan

0

Вот лучший способ (ИМХО):

#include <boost/ptr_container/ptr_vector.hpp> 

#include "vehicle.hpp" 
typedef boost::ptr_vector<Vehicle> vehicle_container; 

#include "derivedvehicles.hpp" 

int main() 
{ 
    vehicle_container v; 
    //... 
    v.emplace_back(new Car); 
    v.emplace_back(new Bike); 
    //... 

    v[0].go(); // Elements accessed as if they are objects (not pointers) 
       // Which makes using in any of the standard 
       // algorithms trivial. 

} // ta-da, everything is cleaned up 
Смежные вопросы