假设我有一个FOO类。
我希望有一个std::vector
的FOO。
如果我做这样的事情会更好:
FOO foo;
foo.init();
foo.prop = 1;
std::vector<FOO> myvec;
myvec.push_back(foo);
foo.prop = 2;
myvect.push_back(foo);
或者更好的做法是:
std::vector<FOO> myvec;
FOO foo;
myvec.push_back(foo);
myvec.back().init();
myvec.back().prop = 1;
myvec.push_back(foo);
myvec.back().init();
myvec.back().prop = 2;
我基本上不确定是否更好地制作模型并推入模型而不是创建实例,推送它,然后从向量中修改它。另外,哪一个更安全,最不可能导致内存泄漏?
由于
答案 0 :(得分:10)
最佳做法是不要使用init()函数 - 您需要构造函数。如果您总是需要设置prop,请为构造函数指定一个参数。这与向量没有任何关系 - 它应该是所有C ++代码的编写方式。
答案 1 :(得分:8)
当您处理值并且不会手动动态分配任何对象时,这两种方法都没有任何内存问题。
我倾向于给FOO
一个构造函数,该构造函数执行init
所做的任何操作并将prop
设置为适当的值。然后你可以推送你想要的值:
myvec.push_back(FOO(1));
myvec.push_back(FOO(2));
答案 2 :(得分:1)
我认为最好的是:
myvec.push_back(FOO(1));
myvec.push_back(FOO(2));
答案 3 :(得分:1)
答案取决于FOO
班级的作用。如果它是一个没有指针等的简单结构,那么你的方法都很好并且也一样。
请注意,push_back
会将对象的副本插入到矢量中。如果您的类在堆上分配内存,则需要一个复制构造函数来创建对象的深层副本,否则最终会导致内存泄漏。此外,如果您的对象非常大,创建副本可能效率低下。在这种情况下,我通常做的是在外部将对象本身分配到堆上并将指针插入向量:
std::vector<FOO *> myvec;
FOO *foo;
foo = new FOO();
foo->init();
foo->val = 1;
myvec.push_back(foo);
foo = new FOO();
foo->init();
foo->val = 2;
myvec.push_back(foo);
但是,在这种情况下,您需要记住在销毁矢量之前释放对象。
答案 4 :(得分:0)
除了其他人在构造函数中初始化对象的内容之外,我想补充一下:
在第二个示例中,您将对象放在向量中然后初始化它们,您可能会将向量置于不可用状态。
例如,如果init()方法可以抛出异常,则向量中将包含非/部分初始化对象。
当然,使用构造函数可以解决这些问题,确保对象已正确初始化。
一般情况下:在对象处于可用状态之前,不要开始使用对象。