哪个更好的做法?

时间:2010-07-04 18:57:53

标签: c++ vector

假设我有一个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;

我基本上不确定是否更好地制作模型并推入模型而不是创建实例,推送它,然后从向量中修改它。另外,哪一个更安全,最不可能导致内存泄漏?

由于

5 个答案:

答案 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()方法可以抛出异常,则向量中将包含非/部分初始化对象。

当然,使用构造函数可以解决这些问题,确保对象已正确初始化。

一般情况下:在对象处于可用状态之前,不要开始使用对象。