我有一个类user,它在向量中存储另一个类foo的对象。我想弄清楚创建类foo对象的最佳方法是什么,并将它们存储在类user的向量中。
class Foo { public: Foo(); Foo(std::string str); std::string name; Foo* GiveMeFoo(std::string arg); }; Foo::Foo() {} Foo::Foo(std::string args):name(args) {} Foo* Foo::GiveMeFoo(std::string arg) { return new Foo(arg) }; class User { public: vector < Foo *> v; vector < Foo> v2; vector < Foo*> v3; void start(); }; void User::start() { const int SIZE = 3; string a[SIZE] = {"one","two","three"}; for (int i = 0; i < SIZE; i++ ){ //method1 Foo *f = new Foo(); f->name = a[i]; v.push_back(f); //method2 Foo f2; f2.name = a[j]; v2.push_back(f2); //method3 Foo f3; v3.push_back(f3.GiveMeFoo(a[k])); } }
问题1:方法1,2和3之间是否有一种首选方式?是否有更好的方法在本地创建远程类的对象并将它们存储在向量中?
问题2:所有被存储在类User的向量中的对象是否持久化(例如,即使foo对象消失,一旦我将这些对象推送到用户的向量上,那么这些foo对象的副本将被持久存储在向量,对吗?
答案 0 :(得分:1)
除非有其他考虑,否则方法2是首选。
Vectors(和其他STL容器)将参数的副本存储到push_back()。
这意味着对于方法1,您在堆上分配Foo,然后在向量中存储指向它的指针。如果销毁User对象,除非您采取措施删除它们,否则Foo对象将泄漏(例如在User析构函数中删除它们)。
对于方法2,您已在堆栈上分配了一个Foo。然后将该对象复制到向量中。当start()退出时,原始Foo被销毁,但副本仍然存在于向量中。如果User对象被销毁,那么向量也是如此,那么就是Foo。
对于方法3,您已在堆栈上分配了一个Foo。然后在其上调用GiveMeFoo(),在堆上分配另一个Foo,然后返回指向它的指针。然后将该指针复制到向量中。当start()退出时,原始的Foo将被销毁,但堆分配的对象将存活。如果User对象被销毁,那么向量也是如此,但是分配给Foo的堆仍然存在并且泄漏,除非你在User的析构函数中手动销毁它。
如果您需要存储指向对象而不是副本的指针,那么最好使用std :: tr1 :: shared_ptr(如果您的编译器支持它)来管理Foo对象的生命周期。
答案 1 :(得分:0)
如果它对某人有帮助,从C ++ 11开始,std :: vector(以及其他一些STL容器)现在可以使用#34; emplace&#34;集合中的一个实例。这样做的好处是可以避免可能的额外重复对象或副本。
对于上面的例子,可以使用这样的代码:
v.emplace_back(a[i]);