指向矢量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>
- 这就是向量中的对象可以安全复制的时候。
上一篇: Pointer to vector vs vector of pointers vs pointer to vector of pointers