在这种情况下,我应该使用指针向量吗?
问题描述:
我想知道在下面的例子中使用指针矢量的优点是什么。在内存管理方面,这三个向量之间是否有区别?哪一个最有效?在这种情况下,我应该使用指针向量吗?
class foo{
public:
foo(int a);
private:
int x;
};
foo::foo(int a){
}
int main() {
std::vector< std::shared_ptr<foo> > vec =
{std::make_shared<foo>(2), std::make_shared<foo>(2)};
std::vector<foo*> vec2 = {new foo(2), new foo(2)};
foo o1(2), o2(2);
std::vector<foo> vec3 = {o1, o2};
return 0;
}
答
根据您当前的例子,我要说的是,std::vector<foo>
是你最好的选择。
std::vector< std::shared_ptr<foo> > vec =
{std::make_shared<foo>(2), std::make_shared<foo>(2)};
使用shared_ptr将通过存储引用计数来处理内存管理。当没有更多的对象引用时,对象将被销毁。
std::vector<foo*> vec2 = {new foo(2), new foo(2)};
foo o1(2), o2(2);
std::vector<foo> vec3 = {o1, o2};
普通整数和指针是相同的大小,以便在你的Foo类一个整型,唯一的区别是内存泄漏的可能性,如果你忘记删除指针。
如果另一个指针正在使用foo对象并尝试使用它,则删除一个指针也会创建异常。
如果你需要指针,智能指针通常是最好的选择,因为它们的内存管理。
答
一般来说,我会考虑使用指针的矢量,如果:
-
在载体中的对象(或对象的部分)的寿命时间是比所述载体本身
的寿命时间大 您依赖多态性和动态分派。然后,你必须指针的基类的载体中,与指针派生类填充它,然后通过虚拟函数做一些
共用指针具有基准计数器,所以它是稍大,但有点更安全。通常的指针,只要你一定要破坏在适当和及时
否则对象是确定的,这是很难告诉你的要求是
为什么不'std :: vector vec3 = {foo {2},foo {2}};'?保持一致。 –
2014-12-06 20:35:40