对传染媒介的尖对指针传染媒介对指针传染媒介的指针

时间:2011-04-13 11:53:30

标签: c++ pointers vector

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

如果我有一个包含vector成员变量的类。 该向量何时应声明为:

  1. 包含值的“全对象”矢量成员变量,即vector<MyClass> my_vector;
  2. 指向矢量的指针,即vector<MyClass>* my_vector;
  3. 指针矢量,即vector<MyClass*> my_vector;
  4. 指针向量的指针,即vector<MyClass*>* my_vector;
  5. 我在我的一个类中有一个特定的例子,我当前已将一个向量声明为案例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之一?

    何时使用哪种情况?

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

    非常感谢!!

7 个答案:

答案 0 :(得分:4)

通常解决方案1是您想要的,因为它是C ++中最简单的:您不必管理内存,C ++会为您完成所有这些(例如,您不需要提供任何析构函数)

在某些特定情况下,这不起作用(最明显的是在使用多态对象时),但一般来说这是唯一的好方法。

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

答案 1 :(得分:1)

绝对是第一个!

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

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

答案 2 :(得分:0)

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

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

class MyClass {

   std::vector<whatever> m_vector;
};

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

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

答案 3 :(得分:0)

在您的示例中,向量是在创建对象时创建的,并且在对象被销毁时会被销毁。这正是使vector成为类的普通成员时所获得的行为。

此外,在您当前的方法中,在复制对象时会遇到问题。默认情况下,指针会产生平面副本,这意味着对象的所有副本将共享相同的向量。这就是为什么,如果您手动管理资源,通常需要The Big Three

指针向量在多态对象的情况下很有用,但是你应该考虑其他选择:

  1. 如果向量拥有对象(这意味着它们的生命周期受向量的限制),则可以使用boost::ptr_vector
  2. 如果对象不属于矢量,您可以使用boost::shared_ptr的矢量或boost::ref的矢量。

答案 4 :(得分:-1)

指向vector的指针很少有用 - vector构造和销毁成本低廉。

对于vector中的元素,没有正确的答案。 vector多久更改一次?复制构造vector中的元素需要多少钱?其他容器是否有vector元素的引用或指针?

根据经验,在测量之前,我没有任何指示,因为复制类很昂贵。当然,您提到的在vector中存储基类的各种子类的情况下,需要指针。

如果您的设计要求您将指针用作boost::shared_ptr元素,那么像vector这样的引用计数智能指针可能是最佳选择。

答案 5 :(得分:-1)

复杂的答案:这取决于。

如果你的向量是共享的,或者它的生命周期与嵌入它的类不同,那么将它作为指针保留可能会更好。 如果您引用的对象没有(或者有昂贵的)复制构造函数,那么最好保留指针向量。相反,如果你的对象使用浅拷贝,使用对象向量可以防止你泄漏......

答案 6 :(得分:-1)

这取决于。无论是选择声明1还是3, 认为如何声明该类型的单个对象 。在决定是使用数字1还是2时,数字1通常是正确的选择,因为矢量是一个非固定大小的容器,所以你不需要改变它在运行时