删除向量中携带的对象? < P>在C++应用程序中,我在一个类的用户对象中创建一个特定类车辆的用户对象,每个操作符在每个实例化之后都是右的,我把它们放在一个向量中,这是第一类的属性(即:向量 V1 < /代码>)。

删除向量中携带的对象? < P>在C++应用程序中,我在一个类的用户对象中创建一个特定类车辆的用户对象,每个操作符在每个实例化之后都是右的,我把它们放在一个向量中,这是第一类的属性(即:向量 V1 < /代码>)。,c++,memory-management,vector,C++,Memory Management,Vector,在程序运行时,我可能需要在某个点删除车辆类的对象。我应该使用操作符delete吗?如果是这样,如何对向量执行此操作?有没有预定义的向量函数来做同样的工作?当我删除它们时,Vehicle类的属性会发生什么变化,在这种情况下,这些属性是指向其他对象的指针?它们是否也被删除 如果在程序结束前不需要删除它们,它们是由析构函数删除还是应该“手动”删除 这是C++方式: #include <memory> #include <vector> #include "vehicle.hp

在程序运行时,我可能需要在某个点删除车辆类的对象。我应该使用操作符delete吗?如果是这样,如何对向量执行此操作?有没有预定义的向量函数来做同样的工作?当我删除它们时,Vehicle类的属性会发生什么变化,在这种情况下,这些属性是指向其他对象的指针?它们是否也被删除

  • 如果在程序结束前不需要删除它们,它们是由析构函数删除还是应该“手动”删除

  • 这是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
    
    #包括
    #包括
    #包括“vehicle.hpp”
    typedef标准::矢量车辆\集装箱;
    #包括“derivedvehicles.hpp”
    int main()
    {
    车辆/集装箱v;
    //...
    v、 后置(新车);
    v、 后置(新自行车);
    //...
    }//砰,一切都打扫干净了
    
    这里有一个更好的方法(IMHO):

    #包括
    #包括“vehicle.hpp”
    typedef boost::ptr_矢量车辆容器;
    #包括“derivedvehicles.hpp”
    int main()
    {
    车辆/集装箱v;
    //...
    v、 后置(新车);
    v、 后置(新自行车);
    //...
    v[0].go();//像对象(不是指针)一样访问元素
    //这使得在任何标准中使用
    //算法微不足道。
    }//塔达,一切都打扫干净了
    
    切勿使用
    删除
    。切勿使用
    指针
    。只能在智能指针的构造函数中使用
    new
    。@Kerrek:“永远不要使用
    指针
    ”是不正确的。永远不要使用拥有原始指针会更正确。@Xeo:可以说,原始指针不能真正“拥有”自己的权利——它的所有权是非本地的外部信息。“魔力”,当然是独一无二的(nee“auto_ptr”,又名“smart pointer”)。因此基本上鼓励它一直使用
    emplace\u back
    (除非您仍然需要添加副本的对象)而不是
    push_back
    对吗?@nwp:将容器设计选项与使用它的示例代码分离?我看不到这种分离带来的灵活性或抽象收益,所以对我来说这看起来像是混淆。
    #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