指向矢量vs指针向量的指针vs指向矢量的指针

只是想知道你认为什么是关于C ++中向量的最佳实践。

如果我有一个包含矢量成员变量的类。 什么时候该向量被声明为:

  • 包含值的“全对象”矢量成员变量,即vector<MyClass> my_vector;
  • 指向矢量的指针,即vector<MyClass>* my_vector;
  • 指针矢量,即vector<MyClass*> my_vector;
  • 指向矢量指针的指针,即vector<MyClass*>* my_vector;
  • 我在我的一个类中有一个特定的例子,当前我已经将一个向量声明为case 4,即vector<AnotherClass*>* my_vector; AnotherClass是另一个我创建的类。

    然后,在我的构造函数的初始化列表中,使用new创建矢量:

    MyClass::MyClass()
    : my_vector(new vector<AnotherClass*>())
    {}
    

    在我的析构函数中,我执行以下操作:

    MyClass::~MyClass()
    {
      for (int i=my_vector->size(); i>0; i--)
      {
        delete my_vector->at(i-1);
      }
      delete my_vector;
    }
    

    向量的元素被添加到我的课程的其中一个方法中。 我不知道有多少物体会提前添加到我的矢量中。 基于解析xml文件,这是在执行代码时决定的。

    这是好的做法吗? 还是应该将矢量声明为其他情况1,2或3中的一个?

    何时使用哪种情况?

    我知道一个向量的元素应该是指针,如果他们是另一个类的子类(多态性)。 但是应该在其他情况下使用指针吗?

    非常感谢你!!


    通常,解决方案1是你想要的,因为它是C ++中最简单的:你不需要管理内存,C ++就可以为你做所有事情(例如,你不需要提供任何析构函数)。

    有些情况下,这是行不通的(特别是在处理多态对象时),但通常这是唯一的好方法。

    即使在处理多态对象或者需要堆分配对象时(无论出于何种原因),原始指针几乎都不是一个好主意。 相反,使用智能指针或智能指针容器。 现代C ++编译器提供即将出现的C ++标准中的shared_ptr 。 如果你使用的编译器还没有,你可以使用Boost的实现。


    绝对是第一!

    您使用矢量进行自动内存管理。 使用指向矢量的原始指针意味着您不再获得自动内存管理,这是没有意义的。

    至于值类型:所有的容器基本上都采用类似价值的语义。 同样,你在使用指针时必须进行内存管理,并且它的目的就是为你做这件事。 这也在C ++ Coding Standards的第79条中描述。 如果您需要使用共享所有权或“弱”链接,请改用相应的智能指针。


    手动删除矢量中的所有元素是一种反模式,违反了C ++中的RAII习惯用法。 所以如果你必须存储指向vector对象的指针,最好使用'smart pointer'(例如boost::shared_ptr )来促进资源的破坏。 例如, boost::shared_ptr在对对象的最后一个引用被销毁时自动调用delete

    也不需要使用new分配MyClass::my_vector 。 一个简单的解决方案是:

    class MyClass {
    
       std::vector<whatever> m_vector;
    };
    

    假设whatever是智能指针类型,没有额外的工作要做。 就是这样,当MyClass实例的生命周期结束时,所有资源都会自动销毁。

    在许多情况下,你甚至可以使用普通的std::vector<MyClass> - 这就是向量中的对象可以安全复制的时候。

    链接地址: http://www.djcxy.com/p/31649.html

    上一篇: Pointer to vector vs vector of pointers vs pointer to vector of pointers

    下一篇: Appending a vector to a vector