只是想知道在C++中关于向量的最佳实践是什么。
如果我有一个包含向量成员变量的类。何时应宣布该向量为:
vector<MyClass> my_vector;vector<MyClass>* my_vector;vector<MyClass*> my_vector;vector<MyClass*>* my_vector;在我的一个类中,我有一个特定的例子,在其中一个类中,我将向量声明为案例4,即vector<AnotherClass*>* my_vector;,其中AnotherClass是我创建的另一个类。
然后,在构造函数的初始化列表中,我使用新的:
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?
什么时候使用哪一种情况?
我知道如果向量是另一个类(多态)的子类,它们应该是指针。但是在其他情况下是否应该使用指针呢?
非常感谢!!
发布于 2011-04-13 11:57:40
通常,解决方案1是您想要的,因为它在C++中是最简单的:您不需要管理内存,C++为您完成了所有这些工作(例如,您不需要提供任何析构函数)。
在某些特定情况下,这种方法不起作用(尤其是在处理多形性对象时),但一般来说,这是唯一的好方法。
即使在处理多形性对象或需要堆分配对象(无论出于什么原因)时,原始指针也几乎不是一个好主意。相反,使用智能指针或智能指针容器。现代C++编译器提供即将推出的C++标准中的shared_ptr。如果您使用的编译器还没有这一点,您可以使用从Boost执行。
发布于 2011-04-13 11:59:59
绝对是第一个!
您可以使用向量进行自动内存管理。使用指向向量的原始指针意味着您不再获得自动内存管理,这是没有意义的。
至于值类型:所有容器基本上都是类似值的语义。同样,在使用指针时,您必须进行内存管理,而向量的目的就是为您执行这些操作。书中的第79项也描述了这一点。如果需要使用共享所有权或“弱”链接,请使用适当的智能指针。
发布于 2011-04-13 11:59:23
手动删除向量中的所有元素是反模式的,并且违反了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> --这是向量中的对象可以安全复制的时候。
https://stackoverflow.com/questions/5648746
复制相似问题