这些做法中哪一个更好?(涉及IT技术)

4

假设我有一个名为FOO的类。

我想要一个FOO的std::vector

如果我这样做,会更好吗:

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
为什么Foo::Foo()不调用Foo::init()?如果您可以发布一个具体的Foo类,可能会有所帮助。 - Sam Miller
只有在使用new而不使用delete时,内存泄漏才会发生。 - the_drow
5个回答

10
最佳实践是不要有一个init()函数 - 你需要一个构造函数。如果你总是需要设置prop,给构造函数一个参数来完成它。这与向量无关 - 这是所有C++代码应该编写的方式。

8

这两种方法都没有内存问题,因为您正在处理值,并且不会手动分配任何对象。

我倾向于给FOO一个构造函数,该函数执行init的操作并将prop设置为适当的值。然后,您只需要推入所需的值即可:

myvec.push_back(FOO(1));
myvec.push_back(FOO(2));

1

我认为最好的方法是:

myvec.push_back(FOO(1));
myvec.push_back(FOO(2));

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);

然而,在这种情况下,你需要记得在销毁向量之前释放对象。


0

除了其他人关于在构造函数中初始化对象的说法,我想补充一下:

在您的第二个示例中,您将对象放入向量中,然后初始化它们,这会导致向量处于不可用状态。

例如,如果init()方法可能会抛出异常,则您的向量中将有一个非/部分初始化的对象。

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

总之:在对象处于可用状态之前不要开始对其进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接